diff --git a/rendercv/data/__init__.py b/rendercv/data/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/rendercv/data/content.py b/rendercv/data/content.py deleted file mode 100644 index d2a24d2..0000000 --- a/rendercv/data/content.py +++ /dev/null @@ -1,301 +0,0 @@ -from datetime import date as Date -from typing import Literal, Union -from typing_extensions import Annotated -import re -import logging -import math -from functools import cached_property - -from pydantic import BaseModel, HttpUrl, model_validator, computed_field -from pydantic.functional_validators import AfterValidator -from pydantic_extra_types.phone_numbers import PhoneNumber - -from spellchecker import SpellChecker - -spell = SpellChecker() -# don't give spelling warnings for these words: -dictionary = [ - "aerostructures", - "sportsperson", - "cern", - "calculix", - "ansys", - "nx", - "aselsan", - "hrjet", - "simularge", - "siemens", -] - - -def check_spelling(sentence: str) -> str: - """ - To be continued... - """ - modifiedSentence = sentence.lower() # convert to lower case - modifiedSentence = re.sub( - r"\-+", " ", modifiedSentence - ) # replace hyphens with spaces - modifiedSentence = re.sub( - "[^a-z\s\-']", "", modifiedSentence - ) # remove unwanted characters - words = modifiedSentence.split() # split sentence into a list of words - misspelled = spell.unknown(words) # find misspelled words - - if len(misspelled) > 0: - for word in misspelled: - if word in dictionary: - continue - logging.warning( - f'The word "{word}" might be misspelled according to the' - " pyspellchecker." - ) - - return sentence - - -SpellCheckedString = Annotated[str, AfterValidator(check_spelling)] - - -def compute_time_span_string(start_date: Date, end_date: Date) -> str: - """ - To be continued... - """ - timeSpan = (end_date - start_date).days - - howManyYears = timeSpan // 365 - if howManyYears == 0: - howManyYearsString = None - elif howManyYears == 1: - howManyYearsString = "1 year" - else: - howManyYearsString = f"{howManyYears} years" - - howManyMonths = math.ceil((timeSpan % 365) / 30) - if howManyMonths == 0: - howManyMonths = 1 - - if howManyMonths == 0: - howManyMonthsString = None - elif howManyMonths == 1: - howManyMonthsString = "1 month" - else: - howManyMonthsString = f"{howManyMonths} months" - - if howManyYearsString is None: - timeSpanString = howManyMonthsString - elif howManyMonthsString is None: - timeSpanString = howManyYearsString - else: - timeSpanString = f"{howManyYearsString} {howManyMonthsString}" - - return timeSpanString - - -def format_date(date: Date) -> str: - """ - To be continued... - """ - # Month abbreviations, - # taken from: https://web.library.yale.edu/cataloging/months - abbreviations_of_months = [ - "Jan.", - "Feb.", - "Mar.", - "Apr.", - "May", - "June", - "July", - "Aug.", - "Sept.", - "Oct.", - "Nov.", - "Dec.", - ] - - month = abbreviations_of_months[int(date.strftime("%m")) - 1] - year = date.strftime("%Y") - date_string = f"{month} {year}" - - return date_string - - -class Skill(BaseModel): - # 1) Mandotory user inputs: - name: str - # 2) Optional user inputs: - details: str = None - - -class Event(BaseModel): - start_date: Date = None - end_date: Date | Literal["present"] = None - date: str = None - location: str - - @model_validator(mode="after") - @classmethod - def check_dates(cls, model): - """ - To be continued... - """ - if ( - model.start_date is not None - and model.end_date is not None - and model.date is not None - ): - logging.warning( - "start_date, end_date and date are all provided. Therefore, date will" - " be ignored." - ) - model.date = None - elif model.date is not None and ( - model.start_date is not None or model.end_date is not None - ): - logging.warning( - "date is provided. Therefore, start_date and end_date will be ignored." - ) - model.start_date = None - model.end_date = None - - return model - - @computed_field - @cached_property - def date_and_location_strings(self) -> list[str]: - date_and_location_strings = [] - - date_and_location_strings.append(self.location) - - if self.date is not None: - # Then it means start_date and end_date are not provided. - date_and_location_strings.append(str(self.start_date)) - else: - # Then it means start_date and end_date are provided. - - start_date = format_date(self.start_date) - - if self.end_date == "present": - end_date = "present" - - time_span_string = compute_time_span_string( - self.start_date, Date.today() - ) - else: - end_date = format_date(self.end_date) - - time_span_string = compute_time_span_string( - self.start_date, self.end_date - ) - - date_and_location_strings.append(f"{start_date} to {end_date}") - - list_of_no_time_span_string_classes = [ - "Education", - ] - if not self.__class__.__name__ in list_of_no_time_span_string_classes: - date_and_location_strings.append(f"{time_span_string}") - - return date_and_location_strings - - -class TestScore(Event): - # 1) Mandotory user inputs: - name: str - score: str - # 2) Optional user inputs: - url: HttpUrl = None - - -class Project(Event): - # 1) Mandotory user inputs: - name: str - # 2) Optional user inputs: - url: HttpUrl = None - highlights: list[SpellCheckedString] = None - - -class Experience(Event): - # 1) Mandotory user inputs: - company: str - position: str - # 2) Optional user inputs: - highlights: list[SpellCheckedString] = None - - -class Education(Event): - # 1) Mandotory user inputs: - institution: str - area: str - # 2) Optional user inputs: - study_type: str = None - gpa: str = None - transcript_url: HttpUrl = None - highlights: list[SpellCheckedString] = None - - @computed_field - @cached_property - def highlight_strings(self) -> list[str]: - """ - To be continued... - """ - highlight_strings = [] - - if self.gpa is not None: - gpaString = f"GPA: {self.gpa}" - if self.transcript_url is not None: - gpaString += f" ([Transcript]({self.transcript_url}))" - highlight_strings.append(gpaString) - - highlight_strings.extend(self.highlights) - - return highlight_strings - - -class SocialNetwork(BaseModel): - # 1) Mandotory user inputs: - network: Literal["LinkedIn", "GitHub", "Instagram"] - username: str - - -class Connection(BaseModel): - # 3) Derived fields (not user inputs): - name: Literal["LinkedIn", "GitHub", "Instagram", "phone", "email", "website"] - value: str - - -class CurriculumVitae(BaseModel): - # 1) Mandotory user inputs: - name: str - # 2) Optional user inputs: - email: str = None - phone: PhoneNumber = None - website: HttpUrl = None - location: str = None - social_networks: list[SocialNetwork] = None - education: list[Education] = None - work_experience: list[Experience] = None - academic_projects: list[Project] = None - extracurricular_activities: list[Experience] = None - test_scores: list[TestScore] = None - skills: list[Skill] = None - - @computed_field - @cached_property - def connections(self) -> list[str]: - connections = [] - if self.phone is not None: - connections.append(Connection(name="phone", value=self.phone)) - if self.email is not None: - connections.append(Connection(name="email", value=self.email)) - if self.website is not None: - connections.append(Connection(name="website", value=str(self.website))) - if self.social_networks is not None: - for social_network in self.social_networks: - connections.append( - Connection( - name=social_network.network, value=social_network.username - ) - ) - - return connections diff --git a/rendercv/data/data_model.py b/rendercv/data/data_model.py deleted file mode 100644 index ad0e136..0000000 --- a/rendercv/data/data_model.py +++ /dev/null @@ -1,7 +0,0 @@ -from pydantic import BaseModel -from .content import CurriculumVitae -from .design import Design - -class RenderCVDataModel(BaseModel): - design: Design - cv: CurriculumVitae \ No newline at end of file diff --git a/rendercv/data/design.py b/rendercv/data/design.py deleted file mode 100644 index 4229b9b..0000000 --- a/rendercv/data/design.py +++ /dev/null @@ -1,32 +0,0 @@ -from pydantic import BaseModel, Field, HttpUrl, model_validator -from pydantic_extra_types.color import Color -from typing import Literal -from datetime import date as Date - -class ClassicTheme(BaseModel): - # 1) Mandotory user inputs: - # 2) Optional user inputs: - primary_color: Color = Field(default="blue") - - page_top_margin: str = Field(default="1.35cm") - page_bottom_margin: str = Field(default="1.35cm") - page_left_margin: str = Field(default="1.35cm") - page_right_margin: str = Field(default="1.35cm") - - section_title_top_margin: str = Field(default="0.13cm") - section_title_bottom_margin: str = Field(default="0.13cm") - - vertical_margin_between_sections: str = Field(default="0.13cm") - - vertical_margin_between_bullet_points: str = Field(default="0.07cm") - bullet_point_left_margin: str = Field(default="0.7cm") - - vertical_margin_between_entries: str = Field(default="0.12cm") - - vertical_margin_between_entries_and_highlights: str = Field(default="0.12cm") - - date_and_location_width: str = Field(default="3.7cm") - -class Design(BaseModel): - theme: Literal['classic'] = 'classic' - options: ClassicTheme \ No newline at end of file diff --git a/rendercv/tinytex/__init__.py b/rendercv/tinytex/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/rendercv/tinytex/render.py b/rendercv/tinytex/render.py deleted file mode 100644 index 45d3550..0000000 --- a/rendercv/tinytex/render.py +++ /dev/null @@ -1,30 +0,0 @@ -import os -import subprocess - - -def render(latexFilePath): - latexFilePath = os.path.normpath(latexFilePath) - latexFile = os.path.basename(latexFilePath) - - if os.name == "nt": - tinytexPath = os.path.join( - os.path.dirname(__file__), - "vendor", - "TinyTeX", - "bin", - "windows", - ) - subprocess.run( - [ - f"{tinytexPath}\\latexmk.exe", - "-lualatex", - # "-c", - f"{latexFile}", - "-synctex=1", - "-interaction=nonstopmode", - "-file-line-error", - ], - cwd=os.path.dirname(latexFilePath), - ) - else: - print("Only Windows is supported for now.") diff --git a/rendercv/tinytex/vendor/README.md b/rendercv/tinytex/vendor/README.md deleted file mode 100644 index 57d45d6..0000000 --- a/rendercv/tinytex/vendor/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# TinyTeX - -Normally, this directory should contain a `TinyTeX` folder with all the TinyTeX binaries. I couldn't figure out how to get a minimal TinyTeX that can render a CV and have a small file size, so I don't push TinyTeX to Github for now. - -## Modifications that have been made to TinyTeX -Attempts to make TinyTeX smaller for CV purposes only. - -### FontAwesome - -- mkdir TinyTeX/textmf-local/fonts/opentype/FontAwesome and copy FontAwesome's opentype contents inside. -- mkdir TinyTeX/textmf-local/tex/latex/FontAwesome and copy FontAwesome's tex contents inside. - -### SourceSans3 Font -- mkdir TinyTeX\texmf-local\fonts\truetype and copy all ttf files inside. - -### Removing files - -- In TinyTeX/, remove all the files except LICENSE.CTAN and LICENSE.TL -- Remove TinyTeX/tlpg/ -- Remove TinyTeX/texmf-var -- Remove TinyTeX/texmf-config -- Remove TinyTeX/texmf-dist/fonts/opentype -- Remove TinyTeX/texmf-dist/fonts/type1 -- Remove TinyTeX/texmf-dist/fonts/afm -- Remove TinyTeX/texmf-dist/fonts/tfm -- Remove TinyTeX/texmf-dist/doc -- Remove TinyTeX/texmf-dist/bibtex - -Remove all below: -[Title](TinyTeX/bin/windows/kpsestat.exe) [Title](TinyTeX/bin/windows/kpsewhich.exe) [Title](TinyTeX/bin/windows/afm2tfm.exe) [Title](TinyTeX/bin/windows/biber.exe) [Title](TinyTeX/bin/windows/bibtex.exe) [Title](TinyTeX/bin/windows/dvilualatex.exe) [Title](TinyTeX/bin/windows/dviluatex.exe) [Title](TinyTeX/bin/windows/dvipdfm.exe) [Title](TinyTeX/bin/windows/dvipdfmx.exe) [Title](TinyTeX/bin/windows/dvips.exe) [Title](TinyTeX/bin/windows/ebb.exe) [Title](TinyTeX/bin/windows/eps2eps.exe) [Title](TinyTeX/bin/windows/epstopdf.exe) [Title](TinyTeX/bin/windows/etex.exe) [Title](TinyTeX/bin/windows/extractbb.exe) [Title](TinyTeX/bin/windows/fc-cache.exe) [Title](TinyTeX/bin/windows/fc-cat.exe) [Title](TinyTeX/bin/windows/fc-list.exe) [Title](TinyTeX/bin/windows/fc-match.exe) [Title](TinyTeX/bin/windows/fc-pattern.exe) [Title](TinyTeX/bin/windows/fc-query.exe) [Title](TinyTeX/bin/windows/fc-scan.exe) [Title](TinyTeX/bin/windows/fc-validate.exe) [Title](TinyTeX/bin/windows/fmtutil.exe) [Title](TinyTeX/bin/windows/fmtutil-sys.exe) [Title](TinyTeX/bin/windows/fmtutil-user.exe) [Title](TinyTeX/bin/windows/gftodvi.exe) [Title](TinyTeX/bin/windows/gftopk.exe) [Title](TinyTeX/bin/windows/gftype.exe) [Title](TinyTeX/bin/windows/hyperxmp-add-bytecount.exe) [Title](TinyTeX/bin/windows/inimf.exe) [Title](TinyTeX/bin/windows/initex.exe) [Title](TinyTeX/bin/windows/kpseaccess.exe) [Title](TinyTeX/bin/windows/kpsereadlink.exe) - -[Title](TinyTeX/bin/windows/icudt72.dll) [Title](TinyTeX/bin/windows/xetex.dll) - -latexindent.exe -[Title](TinyTeX/bin/windows/luahbtex.dll) -pdftex.dll -[Title](TinyTeX/bin/windows/teckit_compile.exe) -[Title](TinyTeX/bin/windows/dvipdfmx.dll) - -"C:\GIT\rendercv\rendercv\tinytex\vendor\TinyTeX\texmf-dist\source" -"C:\GIT\rendercv\rendercv\tinytex\vendor\TinyTeX\texmf-dist\fonts\vf" - -[Title](TinyTeX/texmf-dist/tex/latex/palatino) [Title](TinyTeX/texmf-dist/tex/latex/achemso) [Title](TinyTeX/texmf-dist/tex/latex/adjustbox) [Title](TinyTeX/texmf-dist/tex/latex/ae) [Title](TinyTeX/texmf-dist/tex/latex/algorithmicx) [Title](TinyTeX/texmf-dist/tex/latex/algorithms) [Title](TinyTeX/texmf-dist/tex/latex/amscls) [Title](TinyTeX/texmf-dist/tex/latex/amsfonts) [Title](TinyTeX/texmf-dist/tex/latex/amsmath) [Title](TinyTeX/texmf-dist/tex/latex/apacite) [Title](TinyTeX/texmf-dist/tex/latex/appendix) [Title](TinyTeX/texmf-dist/tex/latex/atveryend) [Title](TinyTeX/texmf-dist/tex/latex/auxhook) [Title](TinyTeX/texmf-dist/tex/latex/awesomebox) [Title](TinyTeX/texmf-dist/tex/latex/base) [Title](TinyTeX/texmf-dist/tex/latex/bbm-macros) [Title](TinyTeX/texmf-dist/tex/latex/beamer) [Title](TinyTeX/texmf-dist/tex/latex/biblatex) [Title](TinyTeX/texmf-dist/tex/latex/booktabs) [Title](TinyTeX/texmf-dist/tex/latex/caption) [Title](TinyTeX/texmf-dist/tex/latex/carlisle) [Title](TinyTeX/texmf-dist/tex/latex/catoptions) [Title](TinyTeX/texmf-dist/tex/latex/ccicons) [Title](TinyTeX/texmf-dist/tex/latex/changepage) [Title](TinyTeX/texmf-dist/tex/latex/chemgreek) [Title](TinyTeX/texmf-dist/tex/latex/cite) [Title](TinyTeX/texmf-dist/tex/latex/cleveref) [Title](TinyTeX/texmf-dist/tex/latex/collectbox) [Title](TinyTeX/texmf-dist/tex/latex/colortbl) [Title](TinyTeX/texmf-dist/tex/latex/comment) [Title](TinyTeX/texmf-dist/tex/latex/courier) [Title](TinyTeX/texmf-dist/tex/latex/crop) [Title](TinyTeX/texmf-dist/tex/latex/csquotes) [Title](TinyTeX/texmf-dist/tex/latex/currfile) [Title](TinyTeX/texmf-dist/tex/latex/dblfloatfix) [Title](TinyTeX/texmf-dist/tex/latex/doclicense) [Title](TinyTeX/texmf-dist/tex/latex/draftwatermark) [Title](TinyTeX/texmf-dist/tex/latex/eepic) [Title](TinyTeX/texmf-dist/tex/latex/endfloat) [Title](TinyTeX/texmf-dist/tex/latex/endnotes) [Title](TinyTeX/texmf-dist/tex/latex/enumitem) [Title](TinyTeX/texmf-dist/tex/latex/environ) [Title](TinyTeX/texmf-dist/tex/latex/epstopdf-pkg) [Title](TinyTeX/texmf-dist/tex/latex/eso-pic) [Title](TinyTeX/texmf-dist/tex/latex/esvect) [Title](TinyTeX/texmf-dist/tex/latex/etex-pkg) [Title](TinyTeX/texmf-dist/tex/latex/etoolbox) [Title](TinyTeX/texmf-dist/tex/latex/euenc) [Title](TinyTeX/texmf-dist/tex/latex/eurosym) [Title](TinyTeX/texmf-dist/tex/latex/everysel) [Title](TinyTeX/texmf-dist/tex/latex/everyshi) [Title](TinyTeX/texmf-dist/tex/latex/extsizes) [Title](TinyTeX/texmf-dist/tex/latex/fancyhdr) [Title](TinyTeX/texmf-dist/tex/latex/fancyvrb) [Title](TinyTeX/texmf-dist/tex/latex/filehook) [Title](TinyTeX/texmf-dist/tex/latex/filemod) [Title](TinyTeX/texmf-dist/tex/latex/firstaid) [Title](TinyTeX/texmf-dist/tex/latex/floatflt) [Title](TinyTeX/texmf-dist/tex/latex/floatrow) [Title](TinyTeX/texmf-dist/tex/latex/fmtcount) [Title](TinyTeX/texmf-dist/tex/latex/fontawesome5) [Title](TinyTeX/texmf-dist/tex/latex/fontaxes) [Title](TinyTeX/texmf-dist/tex/latex/footmisc) [Title](TinyTeX/texmf-dist/tex/latex/forarray) [Title](TinyTeX/texmf-dist/tex/latex/fp) [Title](TinyTeX/texmf-dist/tex/latex/framed) [Title](TinyTeX/texmf-dist/tex/latex/gincltex) [Title](TinyTeX/texmf-dist/tex/latex/graphics) [Title](TinyTeX/texmf-dist/tex/latex/graphics-cfg) [Title](TinyTeX/texmf-dist/tex/latex/graphics-def) [Title](TinyTeX/texmf-dist/tex/latex/grfext) [Title](TinyTeX/texmf-dist/tex/latex/grffile) [Title](TinyTeX/texmf-dist/tex/latex/hardwrap) [Title](TinyTeX/texmf-dist/tex/latex/helvetic) [Title](TinyTeX/texmf-dist/tex/latex/hycolor) [Title](TinyTeX/texmf-dist/tex/latex/hyphenat) [Title](TinyTeX/texmf-dist/tex/latex/ifmtarg) [Title](TinyTeX/texmf-dist/tex/latex/inconsolata) [Title](TinyTeX/texmf-dist/tex/latex/jknapltx) [Title](TinyTeX/texmf-dist/tex/latex/koma-script) [Title](TinyTeX/texmf-dist/tex/latex/kvoptions) [Title](TinyTeX/texmf-dist/tex/latex/kvsetkeys) [Title](TinyTeX/texmf-dist/tex/latex/l3backend) [Title](TinyTeX/texmf-dist/tex/latex/l3kernel) [Title](TinyTeX/texmf-dist/tex/latex/l3packages) [Title](TinyTeX/texmf-dist/tex/latex/lastpage) [Title](TinyTeX/texmf-dist/tex/latex/letltxmacro) [Title](TinyTeX/texmf-dist/tex/latex/lettrine) [Title](TinyTeX/texmf-dist/tex/latex/libertine) [Title](TinyTeX/texmf-dist/tex/latex/lineno) [Title](TinyTeX/texmf-dist/tex/latex/lipsum) [Title](TinyTeX/texmf-dist/tex/latex/listings) [Title](TinyTeX/texmf-dist/tex/latex/lm) [Title](TinyTeX/texmf-dist/tex/latex/logreq) [Title](TinyTeX/texmf-dist/tex/latex/ltxkeys) [Title](TinyTeX/texmf-dist/tex/latex/ly1) [Title](TinyTeX/texmf-dist/tex/latex/makecell) [Title](TinyTeX/texmf-dist/tex/latex/makecmds) [Title](TinyTeX/texmf-dist/tex/latex/marginnote) [Title](TinyTeX/texmf-dist/tex/latex/marvosym) [Title](TinyTeX/texmf-dist/tex/latex/mathalpha) [Title](TinyTeX/texmf-dist/tex/latex/mathtools) [Title](TinyTeX/texmf-dist/tex/latex/mdframed) [Title](TinyTeX/texmf-dist/tex/latex/mdwtools) [Title](TinyTeX/texmf-dist/tex/latex/metalogo) [Title](TinyTeX/texmf-dist/tex/latex/mhchem) [Title](TinyTeX/texmf-dist/tex/latex/microtype) [Title](TinyTeX/texmf-dist/tex/latex/mnras) [Title](TinyTeX/texmf-dist/tex/latex/morefloats) [Title](TinyTeX/texmf-dist/tex/latex/moreverb) [Title](TinyTeX/texmf-dist/tex/latex/ms) [Title](TinyTeX/texmf-dist/tex/latex/mweights) [Title](TinyTeX/texmf-dist/tex/latex/natbib) [Title](TinyTeX/texmf-dist/tex/latex/ncntrsbk) [Title](TinyTeX/texmf-dist/tex/latex/needspace) [Title](TinyTeX/texmf-dist/tex/latex/newfloat) [Title](TinyTeX/texmf-dist/tex/latex/newtx) [Title](TinyTeX/texmf-dist/tex/latex/ntgclass) [Title](TinyTeX/texmf-dist/tex/latex/oberdiek) - - -[Title](TinyTeX/texmf-dist/tex/latex/paralist) [Title](TinyTeX/texmf-dist/tex/latex/pbox) [Title](TinyTeX/texmf-dist/tex/latex/pdfcol) [Title](TinyTeX/texmf-dist/tex/latex/pdflscape) [Title](TinyTeX/texmf-dist/tex/latex/pdfpages) [Title](TinyTeX/texmf-dist/tex/latex/pdfsync) [Title](TinyTeX/texmf-dist/tex/latex/pgf) [Title](TinyTeX/texmf-dist/tex/latex/picinpar) [Title](TinyTeX/texmf-dist/tex/latex/placeins) [Title](TinyTeX/texmf-dist/tex/latex/polyglossia) [Title](TinyTeX/texmf-dist/tex/latex/preprint) [Title](TinyTeX/texmf-dist/tex/latex/preview) [Title](TinyTeX/texmf-dist/tex/latex/psfrag) [Title](TinyTeX/texmf-dist/tex/latex/psnfss) [Title](TinyTeX/texmf-dist/tex/latex/ragged2e) [Title](TinyTeX/texmf-dist/tex/latex/realscripts) [Title](TinyTeX/texmf-dist/tex/latex/refcount) [Title](TinyTeX/texmf-dist/tex/latex/rerunfilecheck) [Title](TinyTeX/texmf-dist/tex/latex/revtex4-1) [Title](TinyTeX/texmf-dist/tex/latex/roboto) [Title](TinyTeX/texmf-dist/tex/latex/sauerj) [Title](TinyTeX/texmf-dist/tex/latex/sectsty) [Title](TinyTeX/texmf-dist/tex/latex/seqsplit) [Title](TinyTeX/texmf-dist/tex/latex/setspace) [Title](TinyTeX/texmf-dist/tex/latex/sidecap) [Title](TinyTeX/texmf-dist/tex/latex/sidenotes) [Title](TinyTeX/texmf-dist/tex/latex/srcltx) [Title](TinyTeX/texmf-dist/tex/latex/standalone) [Title](TinyTeX/texmf-dist/tex/latex/stix) [Title](TinyTeX/texmf-dist/tex/latex/stmaryrd) [Title](TinyTeX/texmf-dist/tex/latex/sttools) [Title](TinyTeX/texmf-dist/tex/latex/subfig) [Title](TinyTeX/texmf-dist/tex/latex/subfigure) [Title](TinyTeX/texmf-dist/tex/latex/symbol) [Title](TinyTeX/texmf-dist/tex/latex/tabto-ltx) [Title](TinyTeX/texmf-dist/tex/latex/tabu) [Title](TinyTeX/texmf-dist/tex/latex/tcolorbox) [Title](TinyTeX/texmf-dist/tex/latex/tex-gyre) [Title](TinyTeX/texmf-dist/tex/latex/textcase) [Title](TinyTeX/texmf-dist/tex/latex/thmtools) [Title](TinyTeX/texmf-dist/tex/latex/threeparttable) [Title](TinyTeX/texmf-dist/tex/latex/threeparttablex) [Title](TinyTeX/texmf-dist/tex/latex/tikzfill) [Title](TinyTeX/texmf-dist/tex/latex/times) [Title](TinyTeX/texmf-dist/tex/latex/tipa) [Title](TinyTeX/texmf-dist/tex/latex/tools) [Title](TinyTeX/texmf-dist/tex/latex/totcount) [Title](TinyTeX/texmf-dist/tex/latex/totpages) [Title](TinyTeX/texmf-dist/tex/latex/translator) [Title](TinyTeX/texmf-dist/tex/latex/trimspaces) [Title](TinyTeX/texmf-dist/tex/latex/tufte-latex) [Title](TinyTeX/texmf-dist/tex/latex/ucs) [Title](TinyTeX/texmf-dist/tex/latex/unicode-math) [Title](TinyTeX/texmf-dist/tex/latex/units) [Title](TinyTeX/texmf-dist/tex/latex/upquote) [Title](TinyTeX/texmf-dist/tex/latex/url) [Title](TinyTeX/texmf-dist/tex/latex/varwidth) [Title](TinyTeX/texmf-dist/tex/latex/vmargin) [Title](TinyTeX/texmf-dist/tex/latex/vruler) [Title](TinyTeX/texmf-dist/tex/latex/wallpaper) [Title](TinyTeX/texmf-dist/tex/latex/wrapfig) [Title](TinyTeX/texmf-dist/tex/latex/xargs) [Title](TinyTeX/texmf-dist/tex/latex/xkeyval) [Title](TinyTeX/texmf-dist/tex/latex/xpatch) [Title](TinyTeX/texmf-dist/tex/latex/xwatermark) [Title](TinyTeX/texmf-dist/tex/latex/zapfchan) [Title](TinyTeX/texmf-dist/tex/latex/zapfding) [Title](TinyTeX/texmf-dist/tex/latex/zref) \ No newline at end of file