diff options
Diffstat (limited to 'macros/latex/contrib')
14 files changed, 3138 insertions, 292 deletions
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-cv/README.md b/macros/latex/contrib/biblatex-contrib/biblatex-cv/README.md new file mode 100644 index 0000000000..4134b879fc --- /dev/null +++ b/macros/latex/contrib/biblatex-contrib/biblatex-cv/README.md @@ -0,0 +1,20 @@ +Version: 0.01 + +# Overview + +This LaTeX package provides an interface for creating an academic curriculum vitae (CV) from a BibTeX .bib file. The package makes use of biblatex/biber to automatically format, group, and sort the entries on a CV. Package documentation and an example CV are provided in the doc folder. + +# Copyright and Licence + +## Authors +- Daniel E. Shub + +## Copyright +- Copyright 2019 --- ... Daniel E. Shub + +## Licence +This work may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3 of this license or (at your option) any later version. + +The latest version of the license is in [https://www.latex-project.org/lppl.txt](https://www.latex-project.org/lppl.txt) and version 1.3 or later is part of all distributions of LaTeX version 2003/06/01 or later. + +This work has the LPPL maintenance status "maintained". diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-cv/american-cv.lbx b/macros/latex/contrib/biblatex-contrib/biblatex-cv/american-cv.lbx new file mode 100644 index 0000000000..76022c7447 --- /dev/null +++ b/macros/latex/contrib/biblatex-contrib/biblatex-cv/american-cv.lbx @@ -0,0 +1,53 @@ +\ProvidesFile{american-cv.lbx}[2020/03/11 v0.01 biblatex-cv localization (DES)] + +\InheritBibliographyExtras{american} +\InheritBibliographyStrings{american} + +\NewBibliographyString{advisor, advisors, by, ci, committee, completed, concentration, contributed, convenor, doctoralthesis, externalexaminer, gpa, guestlecturer, inrevision, internalexaminer, invited, keynote, lecture, lectures, major, masters, mastersthesis, minor, month, months, numcites, ongoing, pending, phd, pi, postdoc, poster, presented, secondsupervisor, students, submitted, supervisor, talk, title, ta, undergraduate, undergraduatethesis, unsuccessful, with} + +\DeclareBibliographyStrings{% + advisor = {{advisor}{advisor}}, + advisors = {{advisors}{advisors}}, + by = {{by}{by}}, + ci = {{co-investigator}{CI}}, + committee = {{committee}{committee}}, + completed = {{completed}{completed}}, + concentration = {{concentration}{concentration}}, + contributed = {{contributed}{contributed}}, + convenor = {{module convenor}{module convenor}}, + doctoralthesis = {{doctoral dissertation}{doctoral dissertation}}, + externalexaminer = {{external examiner}{external examiner}}, + gpa = {{GPA}{GPA}}, + guestlecturer = {{guest lecturer}{guest lecturer}}, + inrevision = {{in revision}{in revision}}, + internalexaminer = {{internal examiner}{internal examiner}}, + invited = {{invited}{invited}}, + keynote = {{keynote}{keynote}}, + lecture = {{lecture}{lecture}}, + lectures = {{lectures}{lectures}}, + major = {{major}{major}}, + masters = {{masters student}{masters student}}, + mastersthesis = {{masters thesis}{masters thesis}}, + minor = {{minor}{minor}}, + month = {{month}{month}}, + months = {{months}{months}}, + numcites = {{number of citations}{number of citations}}, + ongoing = {{ongoing}{ongoing}}, + pending = {{pending}{pending}}, + phd = {{doctoral student}{doctoral student}}, + pi = {{primary investigator}{PI}}, + postdoc = {{postdoctoral fellow}{postdoctoral fellow}}, + poster = {{poster}{poster}}, + presented = {{presented}{presented}}, + secondsupervisor = {{second supervisor}{second supervisor}}, + students = {{students}{students}}, + submitted = {{submitted}{submitted}}, + supervisor = {{supervisor}{supervisor}}, + talk = {{talk}{talk}}, + title = {{title}{title}}, + ta = {{teaching assistant}{teaching assistant}}, + undergraduate = {{undergraduate student}{undergraduate student}}, + undergraduatethesis = {{undergraduate thesis}{undergraduate thesis}}, + unsuccessful = {{unsuccessful}{unsuccessful}}, + with = {{with}{with}}, +} diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-cv/biblatex-cv.bbx b/macros/latex/contrib/biblatex-contrib/biblatex-cv/biblatex-cv.bbx new file mode 100644 index 0000000000..aa1865367c --- /dev/null +++ b/macros/latex/contrib/biblatex-contrib/biblatex-cv/biblatex-cv.bbx @@ -0,0 +1,736 @@ +\ProvidesFile{biblatex-cv.bbx}[2020/03/11 v0.01 biblatex-cv bibliography style (DES)] + +% The author year style seems better suited for a CV than the standard style +\RequireBibliographyStyle{authoryear} + +\DeclareLanguageMappingSuffix{-cv} + +\RequirePackage{datenumber} +\RequirePackage{fp} +\RequirePackage{xpatch} + +% The verbose setting needs to be a style option because it influences the data model +\newtoggle{cv@blx:verbose:committee} +\newtoggle{cv@blx:verbose:education} +\newtoggle{cv@blx:verbose:teaching} + +\DeclareBibliographyOption{verbose-lists}[true]{ + \settoggle{cv@blx:verbose:committee}{#1} + \settoggle{cv@blx:verbose:education}{#1} + \settoggle{cv@blx:verbose:teaching}{#1} +} +\DeclareBibliographyOption{verbose-committee}[true]{ + \settoggle{cv@blx:verbose:committee}{#1} +} +\DeclareBibliographyOption{verbose-education}[true]{ + \settoggle{cv@blx:verbose:education}{#1} +} +\DeclareBibliographyOption{verbose-teaching}[true]{ + \settoggle{cv@blx:verbose:teaching}{#1} +} + +% Add new toggles for the bibliography drivers +\newtoggle{cv@blx:pubstate} + +\newtoggle{cv@blx:education:advisor} +\newtoggle{cv@blx:education:committee} +\newtoggle{cv@blx:education:gpa} +\newtoggle{cv@blx:education:honors} +\newtoggle{cv@blx:education:major} +\newtoggle{cv@blx:education:minor} +\newtoggle{cv@blx:education:title} +\newtoggle{cv@blx:funding:hidePI} +\newtoggle{cv@blx:funding:role} +\newtoggle{cv@blx:funding:status} +\newtoggle{cv@blx:presentation:subtype} +\newtoggle{cv@blx:presentation:type} +\newtoggle{cv@blx:student:institution} +\newtoggle{cv@blx:student:location} +\newtoggle{cv@blx:student:department} +\newtoggle{cv@blx:student:type} +\newtoggle{cv@blx:school:years} +\newtoggle{cv@blx:teaching:institution} +\newtoggle{cv@blx:teaching:location} +\newtoggle{cv@blx:teaching:department} + +% A shorthand way to patch the bibliography drivers defined in standard.bbx except for shorthand and set +\newcommand{\cv@blx@drivers}{article, book, booklet, collection, inbook, incollection, inproceedings, manual, misc, online, patent, periodical, proceedings, report, thesis, unpublished} +\newcommand{\cv@blx@do}[1]{} +\newcommand{\cv@blx@patch@drivers}{% + \expandafter\forcsvlist\expandafter{% + \expandafter\cv@blx@do\expandafter% + }\expandafter{\cv@blx@drivers}% +} + +% Define a macro to calculate the number of months between two dates assuming that the starting and ending years, months, and days are given. +\newcounter{cv@blx@months@start} +\newcounter{cv@blx@months@end} +\newcommand{\cv@blx@months}{} +\newcommand{\cv@blx@calculate@months}{% + \ifboolexpr{% + not test {\iffieldundef{endyear}} and% + not test {\iffieldundef{endmonth}} and% + not test {\iffieldundef{endday}}% + }{% + \setmydatenumber{cv@blx@months@end}{\thefield{endyear}}{\thefield{endmonth}}{\thefield{endday}}% + \setmydatenumber{cv@blx@months@start}{\thefield{year}}{\thefield{month}}{\thefield{day}}% + \FPsub\cv@blx@months{\thecv@blx@months@end}{\thecv@blx@months@start}% + \FPdiv\cv@blx@months{\cv@blx@months}{365.2425}% + \FPmul\cv@blx@months{\cv@blx@months}{12}% + \FPround\cv@blx@months{\cv@blx@months}{0}% + }{% + \undef{\cv@blx@months}% + }% +} + +% Some of the bibliography drivers require new paragraphs within the bibliography entry. Some styles just use \par without the unspacing and punctuation tracking. In reading.bbx this is accomplished with \def\newblockpunct{\item}. +\newrobustcmd*{\addpar}{\unspace\blx@postpunct\par\nobreak\blx@imc@resetpunctfont} +%\newrobustcmd*{\addpar}{\unspace\blx@postpunct\item\blx@imc@resetpunctfont} + +% Make the pubstate field controllable with a toggle and include the journal title if present +\xpatchbibmacro{addendum+pubstate}{% + \printfield{pubstate}% +}{% + \iftoggle{cv@blx:pubstate}{% + \printfield{pubstate}% + \ifentrytype{unpublished}{% + \setunit*{\addcolon\addspace}% + \printfield{journaltitle}% + }{}% + }{}% +}{}{} + +% The extradate part of the date label from the authoryear style is not needed in a CV +\renewbibmacro*{date+extradate}{% + \iffieldundef{labelyear}{}{\printtext[parens]{\printdate}}% +} + +% Provide bibliometric information at the end of the reference. All bibliography drivers defined in standard.bbx, except shorthand and set, end with: +% \newunit\newblock +% \usebibmacro{addendum+pubstate}% +% \setunit{\bibpagerefpunct}\newblock +% \usebibmacro{pageref}% +% \newunit\newblock +% \iftoggle{bbx:related} +% {\usebibmacro{related:init}% +% \usebibmacro{related}} +% {}% +% \usebibmacro{finentry}} +% In reading.bbx the finentry bibmacro is patched, but it seems better to add the bibliometric information after the addendum+pubstate block and before the pageref and related blocks. The bibliometrics bibmacro also prints the note. For most drivers, the note is printed with \printfield{note}, but with the article driver it is printed with the note+pages bibmacro +\renewcommand{\cv@blx@do}[1]{% + \xpatchbibdriver{#1}{% + \setunit{\bibpagerefpunct}\newblock% + }{% + \newunit\newblock% + \usebibmacro{bibliometrics}% + \setunit{\bibpagerefpunct}\newblock% + }{}{}% +} +\cv@blx@patch@drivers + +\renewcommand{\cv@blx@do}[1]{% + \xpatchbibdriver{#1}{% + \printfield{note}% + }{% + }{}{}% +} +\cv@blx@patch@drivers + +\xpatchbibdriver{article}{% + \usebibmacro{note+pages}% +}{% + \setunit{\bibpagespunct}% + \printfield{pages}% + \newunit% +}{}{}% + +% Define new bibmacros +\newbibmacro{advisor}{% + \ifnameundef{advisor}{}{% + \ifnumgreater{\value{advisor}}{1}{% + \bibstring{advisors}% + }{% + \bibstring{advisor}% + }% + \addcolon\addspace% + \printnames[given-family]{advisor}% + }% +} + +\newbibmacro{bibliometrics}{% + \ifboolexpr{% + ( test {\iffieldundef{numcites}} or test {\iffieldequalstr{numcites}{0}} ) and% + test {\iffieldundef{note}}% + }{}{% + \printtext[brackets]{% + \iffieldundef{numcites}{}{% + \iffieldequalstr{numcites}{0}{}{% + \bibstring{numCites}\addcolon\addnbspace\printfield{numcites}% + }% + }% + \newunit\setunit{\addcomma\addspace}% + \iffieldundef{note}{}{\printfield[sentencecase]{note}}% + }% + }% +} + +\newbibmacro{class}{% + \mkdaterangelong{}% + \setunit{\addcomma\addspace}% + \printfield{role}% + \setunit{\addcomma\addspace}% + \iffieldundef{numlectures}{}{% + \iffieldequalstr{numlectures}{1}{% + \printfield{numlectures}\addnbspace\bibstring{lecture}% + }{% + \printfield{numlectures}\addnbspace\bibstring{lectures}% + }% + }% + \setunit{\addcomma\addspace}% + \iffieldundef{numstudents}{}{\printfield{numstudents}\addnbspace\bibstring{students}}% + \setunit{\adddot\addpar}\newblock% +} + +\newbibmacro{classes}{% + \iffieldundef{classes}{% + \setunit{\adddot\addpar}\newblock% + \usebibmacro{class}% + }{% + \def\do##1{% + \entrydata*{##1}{% + \setunit{\adddot\addpar}\newblock% + \usebibmacro{class}% + }% + }% + \docsvfield{classes}% + }% +} + +\newbibmacro{committee}{% + \ifnameundef{committee}{}{% + \bibstring{committee}\addcolon\addspace% + \printnames[given-family]{committee}% + }% +} + +\newbibmacro{degrees}{% + \def\do##1{% + \entrydata*{##1}{% + \item\usedriver{}{degree}% + }% + }% + \list{}{\cv@blx@sublist}% + \docsvfield{degreelist}% + \endlist% +} + +\newbibmacro{degree+major}{% + \printfield{degree}% + \iftoggle{cv@blx:education:major}{% + \ifboolexpr{% + test {\iffieldundef{degree}} or% + test {\iffieldundef{major}}% + }{}{\addspace\bibstring{in}\addspace}% + \printfield{major}% + }{}% +} + +\newbibmacro{department+institution+location}{% + \iffieldundef{saveddepartment}{% + \printfield{department}% + \setunit{\addcomma\addspace}% + }{}% + \iflistundef{savedinstitution}{% + \printlist{institution}% + \setunit{\addcomma\addspace}% + }{}% + \iflistundef{savedlocation}{% + \printlist{location}% + }{}% +} + +\newbibmacro{duration}{% + \ifundef{\cv@blx@months}{}{% + \printtext{\cv@blx@months\addnbspace}% + \ifnumgreater{\cv@blx@months}{1}{% + \bibstring{months}% + }{% + \bibstring{month}% + }% + }% +} + +\newbibmacro{duration+amount+status}{% + \cv@blx@calculate@months% + \ifboolexpr{ + test {\iffieldundef{amount}} and + test {\ifundef{\cv@blx@months}} and + ( + test {\iffieldundef{status}} or + not test {\iftoggle{cv@blx:funding:status}} or + ) and + ( + test {\iffieldundef{role}} or + not test {\iftoggle{cv@blx:funding:role}} or + ( + test {\iftoggle{cv@blx:funding:hidePI}} and + test {\iffieldequalstr{role}{PI}} + ) + ) + }{}{% + \printtext[parens]{% + \usebibmacro{duration}% + \setunit{\addcomma\addspace}% + \printfield{amount}% + \setunit{\addcomma\addspace}% + \iftoggle{cv@blx:funding:status}{% + \printfield{status}% + \setunit{\addcomma\addspace}% + }{}% + \iftoggle{cv@blx:funding:role}{% + \iftoggle{cv@blx:funding:hidePI}{% + \iffieldequalstr{role}{PI}{\printfield{role}}{}% + }{% + \printfield{role}% + }% + }{}% + }% + }% +} + +\newbibmacro{role}{% + \iffieldundef{role}{}{% + \printtext[brackets]{% + \printfield{role}% + }% + }% +} + +% There is some sort of bug with the loop and the seasons not getting updated correctly +\newbibmacro{semesters}{% + \iffieldundef{semesters}{% + \mkdaterangelong{}% + \setunit{\addspace}% + \iffieldundef{role}{}{\printtext[brackets]{\printfield{role}}}% + \setunit{\addcomma\addspace}% + }{% + \def\do##1{% + \entrydata*{##1}{% + \mkdaterangelong{}% + \setunit{\addspace}% + \iffieldundef{role}{}{% + \printtext[brackets]{\printfield{role}}% + }% + \setunit{\addcomma\addspace}% + }% + }% + \docsvfield{semesters}% + }% +} + +\newbibmacro{type+presenter}{% + \ifboolexpr{ + ( + test {\iftoggle{cv@blx:presentation:type}} and + ( + test {\iffieldequalstr{presentationtype}{keynote}} or + test {\iffieldequalstr{presentationtype}{invited}} + ) + ) or ( + test {\iftoggle{cv@blx:presentation:subtype}} and + not test {\iffieldundef{entrysubtype}} + ) or ( + not test {\ifnameundef{presenter}} + ) + }{% + \printtext[brackets]{% + \ifboolexpr{ + test {\iftoggle{cv@blx:presentation:type}} and + ( + test {\iffieldequalstr{presentationtype}{keynote}} or + test {\iffieldequalstr{presentationtype}{invited}} + ) + }{% + \printfield[key]{presentationtype}% + \setunit{\addspace}% + }{}% + \iftoggle{cv@blx:presentation:subtype}{% + \printfield[key]{entrysubtype}% + \setunit{\addspace}% + }{}% + \ifnameundef{presenter}{}{% + \bibstring{presented}\addspace% + \printnames{presenter}% + }% + }% + }{}% +} + +\newbibmacro{yearrange}{% + \printfield{year}% + \ifboolexpr{% + test {\iffieldundef{endyear}} or% + test {\iffieldsequal{year}{endyear}}% + }{}{\bibrangedash\printfield{endyear}}% +} + +\newbibmacro{yearrange+dash}{% + \printfield{year}% + \iffieldundef{endyear}{% + \bibrangedash% + }{% + \iffieldsequal{year}{endyear}{}{\bibrangedash\printfield{endyear}}% + }% +} + +% The biblatex-cv style allows for custom entry types that do not have bibliography drivers defined in standard.bbx. + +% ABSTRACT +% The abstract bibliography driver is a modified version of the article bibliography driver. +\csletcs{blx@bbx@abstract}{blx@bbx@article} +\DeclareFieldFormat[abstract]{citetitle}{\mkbibquote{#1\isdot}} +\DeclareFieldFormat[abstract]{number}{#1} +\DeclareFieldFormat[abstract]{series}{% + \ifinteger{#1}{% + \mkbibordseries{#1}~\bibstring{jourser}% + }{% + \ifbibstring{#1}{\bibstring{#1}}{#1}% + }% +} +\DeclareFieldFormat[abstract]{title}{\mkbibquote{#1\isdot}} +\DeclareFieldFormat[abstract]{volume}{#1} +\xpatchbibdriver{abstract}{\usebibmacro{doi+eprint+url}}{% + \usebibmacro{type+presenter}% + \newunit\newblock% + \usebibmacro{doi+eprint+url}% +}{}{} + +% COMMITTEE +\DeclareBibliographyDriver{committee}{% + \usebibmacro{bibindex}% + \usebibmacro{begentry}% + \usebibmacro{semesters}% + \printfield{title}% + \setunit{\addcomma\addspace}% + \usebibmacro{department+institution+location}% + \newunit\newblock% + \usebibmacro{doi+eprint+url}% + \newunit\newblock% + \usebibmacro{addendum+pubstate}% + \newunit\newblock% + \usebibmacro{bibliometrics}% + \setunit{\bibpagerefpunct}\newblock% + \usebibmacro{pageref}% + \newunit\newblock% + \iftoggle{bbx:related}{% + \usebibmacro{related:init}% + \usebibmacro{related}% + }{}% + \usebibmacro{finentry}% +} + +% EDUCATION +\DeclareBibliographyDriver{school}{% + \usebibmacro{bibindex}% + \usebibmacro{begentry}% + \usebibmacro{department+institution+location}% + \setunit{\addcomma\addspace}% + \iftoggle{cv@blx:school:years}{% + \usebibmacro{yearrange}% + }{}% + \newblockpunct{\addperiod\addpar}% + \iftoggle{cv@blx:education:gpa}{% + \iffieldundef{gpa}{}{% + \printfield{gpa}% + \newblockpunct{\addpar}% + }% + }{}% + \iftoggle{cv@blx:education:honors}{% + \iflistundef{honors}{}{% + \bibstring{honors}\addcolon\addspace% + \printlist{honors}% + } + \newblockpunct{\addpar}% + }{}% + \usebibmacro{degrees}% + \usebibmacro{doi+eprint+url}% + \newunit\newblock% + \usebibmacro{addendum+pubstate}% + \newunit\newblock% + \usebibmacro{bibliometrics}% + \setunit{\bibpagerefpunct}\newblock% + \usebibmacro{pageref}% + \newunit\newblock% + \iftoggle{bbx:related}{% + \usebibmacro{related:init}% + \usebibmacro{related}% + }{}% + \begingroup% + \renewcommand{\finentrypunct}{}% + \usebibmacro{finentry}% + \endgroup% +} + +\DeclareBibliographyDriver{degree}{% + \usebibmacro{bibindex}% + \usebibmacro{begentry}% + \usebibmacro{degree+major}% + \setunit{\addcomma\addspace}% + \usebibmacro{department+institution+location}% + \setunit{\addcomma\addspace}% + \usebibmacro{yearrange}% + \newblockpunct{\addperiod\addpar}% + \iftoggle{cv@blx:education:title}{% + \printfield{title}% + \newblockpunct{\addpar}% + }{}% + \iftoggle{cv@blx:education:advisor}{% + \usebibmacro{advisor}% + \newblockpunct{\addpar}% + }{}% + \iftoggle{cv@blx:education:committee}{% + \usebibmacro{committee}% + \newblockpunct{\addpar}% + }{}% + \iftoggle{cv@blx:education:minor}{% + \iflistundef{minor}{}{% + \bibstring{minor}\addcolon\addspace% + \printlist{minor}% + }% + \newblockpunct{\addpar}% + \iflistundef{concentration}{}{% + \bibstring{concentration}\addcolon\addspace% + \printlist{concentration}% + }% + \newblockpunct{\addpar}% + }{}% + \iftoggle{cv@blx:education:gpa}{% + \printfield{gpa}% + \newblockpunct{\addpar}% + }{}% + \iftoggle{cv@blx:education:honors}{% + \iflistundef{honors}{}{% + \printlist{honors}% + } + \newblockpunct{\addpar}% + }{}% + \usebibmacro{doi+eprint+url}% + \newunit\newblock% + \usebibmacro{addendum+pubstate}% + \newunit\newblock% + \usebibmacro{bibliometrics}% + \setunit{\bibpagerefpunct}\newblock% + \usebibmacro{pageref}% + \newunit\newblock% + \iftoggle{bbx:related}{% + \usebibmacro{related:init}% + \usebibmacro{related}% + }{}% + \begingroup% + \renewcommand{\finentrypunct}{}% + \usebibmacro{finentry}% + \endgroup% +} + +% FUNDING +\DeclareBibliographyDriver{funding}{% + \usebibmacro{bibindex}% + \usebibmacro{begentry}% + \usebibmacro{yearrange}% + \setunit{\addspace}% + \usebibmacro{duration+amount+status}% + \setunit{\addcolon\addspace}% + \printfield{funder}% + \setunit{\addcomma\addspace}% + \printfield{type}% + \setunit{\addspace}% + \printfield[parens]{number}% + \newunit\newblock% + \usebibmacro{title}% + \newunit\newblock% + \usebibmacro{doi+eprint+url}% + \newunit\newblock% + \usebibmacro{addendum+pubstate}% + \newunit\newblock% + \usebibmacro{bibliometrics}% + \setunit{\bibpagerefpunct}\newblock% + \usebibmacro{pageref}% + \newunit\newblock% + \iftoggle{bbx:related}{% + \usebibmacro{related:init}% + \usebibmacro{related}% + }{}% + \usebibmacro{finentry}% +} + +% PRESENTATION +\DeclareBibliographyDriver{presentation}{% + \usebibmacro{bibindex}% + \usebibmacro{begentry}% + \usebibmacro{author}% + \setunit{\printdelim{nametitledelim}}\newblock% + \usebibmacro{title}% + \setunit*{\adddot\addspace}% + \usebibmacro{department+institution+location}% + \newunit\newblock% + \usebibmacro{type+presenter}% + \newunit\newblock% + \usebibmacro{doi+eprint+url}% + \newunit\newblock% + \usebibmacro{addendum+pubstate}% + \newunit\newblock% + \usebibmacro{bibliometrics}% + \setunit{\bibpagerefpunct}\newblock% + \usebibmacro{pageref}% + \newunit\newblock% + \iftoggle{bbx:related}{% + \usebibmacro{related:init}% + \usebibmacro{related}% + }{}% + \usebibmacro{finentry}% +} + +% STUDENT +\DeclareBibliographyDriver{student}{% + \usebibmacro{bibindex}% + \usebibmacro{begentry}% + \printnames{name}% + \setunit{\addcomma\addspace}% + \iftoggle{cv@blx:student:type}{% + \printfield{entrysubtype}% + \setunit{\addcomma\addspace}% + }{}% + \usebibmacro{yearrange}% + \setunit{\addcomma\addspace}% + \iftoggle{cv@blx:student:department}{% + \printfield{department}% + \setunit{\addcomma\addspace}% + }{}% + \iftoggle{cv@blx:student:institution}{% + \printlist{institution}% + \setunit{\addcomma\addspace}% + }{}% + \iftoggle{cv@blx:student:location}{% + \printlist{location}% + \setunit{\addcomma\addspace}% + }{}% + \newunit\newblock% + \usebibmacro{role}% + \newunit\newblock% + \usebibmacro{doi+eprint+url}% + \newunit\newblock% + \usebibmacro{addendum+pubstate}% + \newunit\newblock% + \usebibmacro{bibliometrics}% + \setunit{\bibpagerefpunct}\newblock% + \usebibmacro{pageref}% + \newunit\newblock% + \iftoggle{bbx:related}{% + \usebibmacro{related:init}% + \usebibmacro{related}% + }{}% + \usebibmacro{finentry}% +} + +% TEACHING +\DeclareBibliographyDriver{teaching}{% + \usebibmacro{bibindex}% + \usebibmacro{begentry}% + \printfield{title}% + \setunit{\addspace}% + \printfield[parens]{number}% + \setunit{\addcomma\addspace}% + \iftoggle{cv@blx:teaching:department}{% + \printfield{department}% + \setunit{\addcomma\addspace}% + }{}% + \iftoggle{cv@blx:teaching:institution}{% + \printlist{institution}% + \setunit{\addcomma\addspace}% + }{}% + \iftoggle{cv@blx:teaching:location}{% + \printlist{location}% + \setunit{\addcomma\addspace}% + }{}% + \newunit\newblock% + \usebibmacro{doi+eprint+url}% + \newunit\newblock% + \usebibmacro{addendum+pubstate}% + \newunit\newblock% + \usebibmacro{bibliometrics}% + \setunit{\bibpagerefpunct}\newblock% + \usebibmacro{pageref}% + \newunit\newblock% + \iftoggle{cv@blx:verbose:teaching}{% + \usebibmacro{classes}% + }{% + \setunit{\adddot\addspace}\newblock% + \usebibmacro{class}% + }% + \iftoggle{bbx:related}{% + \usebibmacro{related:init}% + \usebibmacro{related}% + }{}% + \usebibmacro{finentry}% +} + +% Define new field formats + +% Allow key datatypes to access localization strings +\DeclareFieldFormat{key}{\ifbibstring{#1}{\bibstring{#1}}{#1}} +\DeclareFieldFormat{role}{\ifbibstring{#1}{\bibstring{#1}}{#1}} +\DeclareFieldFormat{status}{\ifbibstring{#1}{\bibstring{#1}}{#1}} + +\DeclareFieldFormat[committee]{title}{#1} + +\DeclareFieldFormat[degree]{degree}{#1\isdot} +\DeclareFieldFormat[degree]{title}{\bibstring{title}\addcolon\addspace#1} +\DeclareFieldFormat[school, degree]{gpa}{\bibstring{gpa}\addcolon\addspace#1} + +\DeclareFieldFormat[funding]{amount}{\printfield{currency}#1} + +\DeclareFieldFormat[teaching]{title}{#1} + +\DeclareFieldFormat[student]{entrysubtype}{\ifbibstring{#1}{\bibstring{#1}}{#1}} + +\DeclareFieldFormat[course]{related}{\mkbibparens{#1}} + +% The date label from the authoryear style includes "no date" which is not needed in a CV +\DeclareLabeldate{% + \field{date} + \field{year} + \field{eventdate} + \field{origdate} + \field{urldate} +} + +% Redefine ydnt sorting to sort by endyear. Taken from biblatex.def +\DeclareSortingTemplate{ydnt}{ + \sort{ + \field{presort} + } + \sort[final]{ + \field{sortkey} + } + \sort[final, direction=descending]{ + \field{sortyear} + \field[padwidth = 4, padchar = 9]{endyear} + } + \sort[direction=descending]{ + \field{sortyear} + \field{year} + \literal{9999} + } + \sort{ + \field{sortname} + \field{author} + \field{editor} + \field{translator} + \field{sorttitle} + \field{title} + } + \sort{ + \field{sorttitle} + \field{title} + } +} diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-cv/biblatex-cv.cbx b/macros/latex/contrib/biblatex-contrib/biblatex-cv/biblatex-cv.cbx new file mode 100644 index 0000000000..80cff4e9ff --- /dev/null +++ b/macros/latex/contrib/biblatex-contrib/biblatex-cv/biblatex-cv.cbx @@ -0,0 +1,3 @@ +\ProvidesFile{biblatex-cv.cbx}[2020/03/11 v0.01 biblatex-cv citation style (DES)] + +\RequireCitationStyle{authoryear} diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-cv/biblatex-cv.dbx b/macros/latex/contrib/biblatex-contrib/biblatex-cv/biblatex-cv.dbx new file mode 100644 index 0000000000..745ab411bc --- /dev/null +++ b/macros/latex/contrib/biblatex-contrib/biblatex-cv/biblatex-cv.dbx @@ -0,0 +1,386 @@ +\ProvidesFile{biblatex-cv.dbx}[2020/03/11 v0.01 biblatex-cv data model (DES)] + +% Add new data fields for both existing and new entry types +\DeclareDatamodelFields[type=list, datatype=name]{advisor, committee, name, presenter} +\DeclareDatamodelFields[type=list, datatype=literal]{concentration, honors, minor} +\DeclareDatamodelFields[type=field, datatype=integer]{amount, numcites, numlectures, numstudents} +\DeclareDatamodelFields[type=field, datatype=literal]{currency, degree, department, funder, gpa, major, presentationtype} +\DeclareDatamodelFields[type=field, datatype=key]{role, status} +\DeclareDatamodelFields[type=field, format=xsv, datatype=entrykey]{classes, degreelist, semesters} + +% For all name lists, create a new field to indicate if a name has been deleted from the list +\newcommand{\cv@blx@tempa}[1]{% + \newtoggle{cv@blx:delete:#1}% + \DeclareDatamodelFields[type=field, datatype=integer]{#1deleted}% +} +\forcsvlist{\cv@blx@tempa}{afterword, annotator, author, bookauthor, % + commentator, editor, editora, editorb, editorc, foreword, holder, % + introduction, namea, nameb, namec, translator, shortauthor, % + shorteditor, advisor, committee, name, presenter% +} + +% Modify the existing data model inherited from blx-dm.def +\DeclareDatamodelConstraints{ + \constraint[type=data, datatype=pattern, pattern=\regexp{( + ^forthcoming$| + ^inpreparation$| + ^inpress$| + ^inrevision$| + ^prepublished$| + ^submitted$ + )}]{ + \constraintfield{pubstate} + } +} + +% Define global changes to the data model +\DeclareDatamodelConstraints{ + \constraint[type=data, datatype=pattern, + pattern=\regexp{( + ^contributed$| + ^internal$| + ^invited$| + ^job$| + ^keynote$ + )} + ]{ + \constraintfield{presentationtype} + } +} + +% ARTICLE +\DeclareDatamodelEntryfields[article]{numcites} +\DeclareDatamodelConstraints[article]{ + \constraint[type=mandatory]{ + \constraintfield{numcites} + } +} + +% UNPUBLISHED +\DeclareDatamodelEntryfields[unpublished]{journaltitle} + +% THESIS +\DeclareDatamodelConstraints[thesis]{ + \constraint[type=data, datatype=pattern, + pattern=\regexp{( + ^doctoralthesis$| + ^mastersthesis$| + ^undergradthesis$ + )}% + ]{ + \constraintfield{type} + } +} + +% Define the data model for new entry types not defined in blx-dm.def + +% ABSTRACT +% The data model for the abstract entrytype is a modified version of the article entrytype data model. We start by copying the article data model from blx-dm.def +\DeclareDatamodelEntrytypes{abstract} +\DeclareDatamodelEntryfields[abstract]{ + addendum, + annotator, + author, + commentator, + doi, + editor, + editora, + editorb, + editorc, + editortype, + editoratype, + editorbtype, + editorctype, + eid, + eprint, + eprintclass, + eprinttype, + issn, + issue, + issuetitle, + issuesubtitle, + journalsubtitle, + journaltitle, + language, + note, + number, + origlanguage, + pages, + pubstate, + series, + subtitle, + title, + titleaddon, + translator, + version, + volume, +} +\DeclareDatamodelConstraints[abstract]{ + \constraint[type=mandatory]{ + \constraintfieldsxor{ + \constraintfield{date} + \constraintfield{year} + } + \constraintfield{author} + \constraintfield{journaltitle} + \constraintfield{title} + } +} + +\DeclareDatamodelEntryfields[abstract]{ + entrysubtype, + presentationtype, + presenter, + presenterdeleted, +} +\DeclareDatamodelConstraints[abstract]{ + \constraint[type=mandatory]{ + \constraintfield{entrysubtype} + \constraintfield{presentationtype} + \constraintfieldsor{ + \constraintfield{presenter} + \constraintfield{presenterdeleted} + } + } + \constraint[type=data, datatype=pattern, + pattern=\regexp{(^poster$|^talk$|)} + ]{ + \constraintfield{entrysubtype} + } +} + +% COMMITTEE +\DeclareDatamodelEntrytypes{committee} +\DeclareDatamodelEntryfields[committee]{ + date,day,endday,endmonth,endyear,month,year, + entrysubtype, + title, + institution, + location, + department, + role, + semesters, +} +\DeclareDatamodelConstraints[committee]{ + \constraint[type=mandatory]{ + \constraintfieldsor{ + \constraintfield{date} + \constraintfield{semesters} + } + \constraintfield{entrysubtype} + \constraintfield{title} + \constraintfield{institution} + } + \constraint[type=data, datatype=pattern, pattern=\regexp{(% + ^departmental$| + ^external$| + ^institutional$ + )}]{ + \constraintfield{entrysubtype} + } +} + +% EDUCATION +\DeclareDatamodelEntrytypes{school} +\DeclareDatamodelEntryfields[school]{ + date,day,endday,endmonth,endyear,month,year, + institution, + location, + department, + degreelist, + gpa, + honors, +} +\DeclareDatamodelConstraints[school]{ + \constraint[type=mandatory]{ + \constraintfieldsxor{ + \constraintfield{date} + \constraintfield{year} + } + \constraintfield{institution} + \constraintfield{location} + } +} + +\DeclareDatamodelEntrytypes{degree} +\DeclareDatamodelEntryfields[degree]{ + date,day,endday,endmonth,endyear,month,year, + institution, + location, + department, + degree, + gpa, + honors, + major, + minor, + concentration, + advisor, + committee, + title, +} +\DeclareDatamodelConstraints[degree]{ + \constraint[type=mandatory]{ + \constraintfieldsxor{ + \constraintfield{date} + \constraintfield{year} + } + \constraintfield{institution} + \constraintfield{location} + } +} + +% FUNDING +\DeclareDatamodelEntrytypes{funding} +\DeclareDatamodelEntryfields[funding]{ + date,day,endday,endmonth,endyear,month,year, + entrysubtype, + status, + author, + funder, + title, + role, + amount, + currency, + number, + type, +} +\DeclareDatamodelConstraints[funding]{ + \constraint[type=mandatory]{ + \constraintfieldsxor{ + \constraintfield{date} + \constraintfield{year} + } + \constraintfield{entrysubtype} + \constraintfield{status} + \constraintfield{author} + \constraintfield{funder} + } + \constraint[type=data, datatype=pattern, pattern=\regexp{(^individual$|^institutional$)}]{ + \constraintfield{entrysubtype} + } + \constraint[ + type=data, datatype=pattern, + pattern=\regexp{(^completed$|^ongoing$|^pending$|^submitted$|^unsuccessful$)} + ]{ + \constraintfield{status} + } +} + +% PRESENTATION +\DeclareDatamodelEntrytypes{presentation} +\DeclareDatamodelEntryfields[presentation]{ + date,day,endday,endmonth,endyear,month,year, + entrysubtype, + author, + presentationtype, + presenter, + presenterdeleted, + title, + institution, + location, + department, +} +\DeclareDatamodelConstraints[presentation]{ + \constraint[type=mandatory]{ + \constraintfieldsxor{ + \constraintfield{date} + \constraintfield{year} + } + \constraintfield{entrysubtype} + \constraintfield{author} + \constraintfield{presentationtype} + \constraintfieldsor{ + \constraintfield{presenter} + \constraintfield{presenterdeleted} + } + \constraintfield{title} + \constraintfield{institution} + \constraintfield{location} + } + \constraint[type=data, datatype=pattern, + pattern=\regexp{(^poster$|^talk$|)} + ]{ + \constraintfield{entrysubtype} + } +} + +% STUDENT +\DeclareDatamodelEntrytypes{student} +\DeclareDatamodelEntryfields[student]{ + date,day,endday,endmonth,endyear,month,year, + entrysubtype, + role, + name, + institution, + location, + department, +} +\DeclareDatamodelConstraints[student]{ + \constraint[type=mandatory]{ + \constraintfieldsxor{ + \constraintfield{date} + \constraintfield{year} + } + \constraintfield{entrysubtype} + \constraintfield{role} + \constraintfield{name} + \constraintfield{institution} + \constraintfield{location} + } + \constraint[type=data, datatype=pattern, pattern=\regexp{(^masters$|^phd$|^postdoc$|^undergraduate$)}]{ + \constraintfield{entrysubtype} + } + \constraint[type=data, datatype=pattern, pattern=\regexp{(^externalexaminer$|^internalexaminer$|^secondsupervisor$|^supervisor$)}]{ + \constraintfield{role} + } +} + +% TEACHING +\DeclareDatamodelEntrytypes{teaching} +\DeclareDatamodelEntryfields[teaching]{ + date,day,endday,endmonth,endyear,month,year, + entrysubtype, + title, + department, + institution, + location, + number, + numlectures, + numstudents, + role, + classes, +} +\DeclareDatamodelConstraints[teaching]{ + \constraint[type=mandatory]{ + \constraintfieldsxor{ + \constraintfield{date} + \constraintfield{classes} + } + \constraintfield{entrysubtype} + \constraintfield{title} + \constraintfield{department} + \constraintfield{institution} + \constraintfield{location} + } + \constraint[type=data, datatype=pattern, pattern=\regexp{(^graduate$|^undergraduate$)}]{ + \constraintfield{entrysubtype} + } +} + +% ADDITIONAL FIELDS TO ADD TO SUPPORTED ENTRY TYPES +% Education: description, coursework +% Funding: co-investigators, description, publications +% Student: title, funding, current position, description, publications, something to indicate students that dropped out +% Teaching: description, textbook, objectives, rating + +% ADDITIONAL ENTRY TYPES NOT YET SUPPORTED: +% Panels Organized -- Maybe this should be a subtype of \bibtype{committee} +% Panel Discussant -- Maybe this should be a subtype of \bibtype{committee} +% Awards/Honors +% Positions -- permanent, visiting, adjunct, affiliated, ... +% Research Experience +% Media Coverage +% Related skills +% Non-Academic Work +% Professional Memberships/Affiliations +% References diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-cv/biblatex-cv.sty b/macros/latex/contrib/biblatex-contrib/biblatex-cv/biblatex-cv.sty new file mode 100644 index 0000000000..834d7724aa --- /dev/null +++ b/macros/latex/contrib/biblatex-contrib/biblatex-cv/biblatex-cv.sty @@ -0,0 +1,776 @@ +% Copyright (c) 2020- Daniel E. Shub. +% +% Permission is granted to copy, distribute and/or modify this software under the terms of the LaTeX Project Public License (LPPL), version 1.3c. +% +% This software is provided 'as is', without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. + +\NeedsTeXFormat{LaTeX2e}[2005/12/01] +\ProvidesPackage{biblatex-cv}[2020/03/11 v0.01 biblatex-cv bibliography style (DES)] + +\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{biblatex}} +\ProcessOptions\relax + +\PassOptionsToPackage{ + labelnumber = true, defernumbers = true, backend = biber, + style = biblatex-cv, sorting = ydnt, maxnames = 999 +}{biblatex} +\RequirePackage{biblatex} + +\RequirePackage{expl3, xparse} +\RequirePackage{totcount} +\RequirePackage{xpatch} + +% Document layout +\setlength{\biblabelsep}{0.5em} +\defbibheading{bibliography}{} + +\toggletrue{cv@blx:delete:author} +\toggletrue{cv@blx:delete:presenter} + +\toggletrue{cv@blx:pubstate} + +\togglefalse{cv@blx:funding:hidePI} +\toggletrue{cv@blx:funding:role} +\toggletrue{cv@blx:funding:status} +\toggletrue{cv@blx:presentation:subtype} +\toggletrue{cv@blx:presentation:type} +\toggletrue{cv@blx:student:institution} +\toggletrue{cv@blx:student:location} +\toggletrue{cv@blx:student:department} +\toggletrue{cv@blx:student:type} +\toggletrue{cv@blx:school:years} +\toggletrue{cv@blx:teaching:institution} +\toggletrue{cv@blx:teaching:location} +\toggletrue{cv@blx:teaching:department} + +% Bibfilters + +% ABSTRACT +\defbibcheck{Abstract}{% + \ifentrytype{abstract}{}{\skipentry}% +} +\defbibcheck{Abstract:Contributed}{% + \ifentrytype{abstract}{}{\skipentry}% + \iffieldequalstr{presentationtype}{contributed}{}{\skipentry}% +} +\defbibcheck{Abstract:Invited}{% + \ifentrytype{abstract}{}{\skipentry}% + \iffieldequalstr{presentationtype}{invited}{}{\skipentry}% +} +\defbibcheck{Abstract:Keynote}{% + \ifentrytype{abstract}{}{\skipentry}% + \iffieldequalstr{presentationtype}{keynote}{}{\skipentry} +} +\defbibcheck{Abstract:NotInternalOrJob}{% + \ifentrytype{abstract}{}{\skipentry}% + \iffieldequalstr{presentationtype}{internal}{\skipentry}{% + \iffieldequalstr{presentationtype}{job}{\skipentry}{}% + }% +} + +\defbibcheck{Abstract:PosterContributed}{% + \ifentrytype{abstract}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{poster}{}{\skipentry}% + \iffieldequalstr{presentationtype}{contributed}{}{\skipentry}% +} +\defbibcheck{Abstract:PosterInvited}{% + \ifentrytype{abstract}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{poster}{}{\skipentry}% + \iffieldequalstr{presentationtype}{invited}{}{\skipentry}% +} +\defbibcheck{Abstract:PosterKeynote}{% + \ifentrytype{abstract}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{poster}{}{\skipentry}% + \iffieldequalstr{presentationtype}{keynote}{}{\skipentry} +} +\defbibcheck{Abstract:PosterNotInternalOrJob}{% + \ifentrytype{abstract}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{poster}{}{\skipentry}% + \iffieldequalstr{presentationtype}{internal}{\skipentry}{% + \iffieldequalstr{presentationtype}{job}{\skipentry}{}% + }% +} + +\defbibcheck{Abstract:TalkContributed}{% + \ifentrytype{abstract}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{talk}{}{\skipentry}% + \iffieldequalstr{presentationtype}{contributed}{}{\skipentry}% +} +\defbibcheck{Abstract:TalkInvited}{% + \ifentrytype{abstract}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{talk}{}{\skipentry}% + \iffieldequalstr{presentationtype}{invited}{}{\skipentry}% +} +\defbibcheck{Abstract:TalkKeynote}{% + \ifentrytype{abstract}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{talk}{}{\skipentry}% + \iffieldequalstr{presentationtype}{keynote}{}{\skipentry} +} +\defbibcheck{Abstract:TalkNotInternalOrJob}{% + \ifentrytype{abstract}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{talk}{}{\skipentry}% + \iffieldequalstr{presentationtype}{internal}{\skipentry}{% + \iffieldequalstr{presentationtype}{job}{\skipentry}{}% + }% +} + +% COMMITTEE +\defbibcheck{Committee}{% + \ifentrytype{committee}{}{\skipentry}% +} +\defbibcheck{Committee:External}{% + \ifentrytype{committee}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{external}{}{\skipentry}% +} +\defbibcheck{Committee:Departmental}{% + \ifentrytype{committee}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{departmental}{}{\skipentry}% +} +\defbibcheck{Committee:Institutional}{% + \ifentrytype{committee}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{institutional}{}{\skipentry}% +} +\defbibcheck{Committee:NotExternal}{% + \ifentrytype{committee}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{external}{\skipentry}{}% +} + +% EDUCATION +\defbibcheck{Education}{% + \ifentrytype{school}{}{% + \ifentrytype{degree}{}{\skipentry}% + }% +} + +% FUNDING +\defbibcheck{Funding}{% + \ifentrytype{funding}{}{\skipentry}% +} +\defbibcheck{Funding:Completed}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{status}{completed}{}{\skipentry}% +} +\defbibcheck{Funding:Ongoing}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{status}{ongoing}{}{\skipentry}% +} +\defbibcheck{Funding:Pending}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{status}{pending}{}{\skipentry}% +} +\defbibcheck{Funding:Submitted}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{status}{submitted}{}{\skipentry}% +} +\defbibcheck{Funding:Unsuccessful}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{status}{unsuccessful}{}{\skipentry}% +} +\defbibcheck{Funding:CurrentAndPending}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{status}{ongoing}{}{% + \iffieldequalstr{status}{pending}{}{% + \iffieldequalstr{status}{submitted}{}{\skipentry}% + }% + }% +} +\defbibcheck{Funding:NotUnsuccessful}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{status}{unsuccessful}{\skipentry}{}% +} + +\defbibcheck{Funding:Individual}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{individual}{}{\skipentry}% +} +\defbibcheck{Funding:IndividualCompleted}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{individual}{}{\skipentry}% + \iffieldequalstr{status}{completed}{}{\skipentry}% +} +\defbibcheck{Funding:IndividualOngoing}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{individual}{}{\skipentry}% + \iffieldequalstr{status}{ongoing}{}{\skipentry}% +} +\defbibcheck{Funding:IndividualPending}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{individual}{}{\skipentry}% + \iffieldequalstr{status}{pending}{}{\skipentry}% +} +\defbibcheck{Funding:IndividualSubmitted}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{individual}{}{\skipentry}% + \iffieldequalstr{status}{submitted}{}{\skipentry}% +} +\defbibcheck{Funding:IndividualUnsuccessful}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{individual}{}{\skipentry}% + \iffieldequalstr{status}{unsuccessful}{}{\skipentry}% +} +\defbibcheck{Funding:IndividualCurrentAndPending}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{individual}{}{\skipentry}% + \iffieldequalstr{status}{ongoing}{}{% + \iffieldequalstr{status}{pending}{}{% + \iffieldequalstr{status}{submitted}{}{\skipentry}% + }% + }% +} +\defbibcheck{Funding:IndividualNotUnsuccessful}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{individual}{}{\skipentry}% + \iffieldequalstr{status}{unsuccessful}{\skipentry}{}% +} + +\defbibcheck{Funding:Institutional}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{institutional}{}{\skipentry}% +} +\defbibcheck{Funding:InstitutionalCompleted}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{institutional}{}{\skipentry}% + \iffieldequalstr{status}{completed}{}{\skipentry}% +} +\defbibcheck{Funding:InstitutionalOngoing}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{institutional}{}{\skipentry}% + \iffieldequalstr{status}{ongoing}{}{\skipentry}% +} +\defbibcheck{Funding:InstitutionalPending}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{institutional}{}{\skipentry}% + \iffieldequalstr{status}{pending}{}{\skipentry}% +} +\defbibcheck{Funding:InstitutionalSubmitted}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{institutional}{}{\skipentry}% + \iffieldequalstr{status}{submitted}{}{\skipentry}% +} +\defbibcheck{Funding:InstitutionalUnsuccessful}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{institutional}{}{\skipentry}% + \iffieldequalstr{status}{unsuccessful}{}{\skipentry}% +} +\defbibcheck{Funding:InstitutionalCurrentAndPending}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{institutional}{}{\skipentry}% + \iffieldequalstr{status}{ongoing}{}{% + \iffieldequalstr{status}{pending}{}{% + \iffieldequalstr{status}{submitted}{}{\skipentry}% + }% + }% +} +\defbibcheck{Funding:InstitutionalNotUnsuccessful}{% + \ifentrytype{funding}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{institutional}{}{\skipentry}% + \iffieldequalstr{status}{unsuccessful}{\skipentry}{}% +} + +% PRESENTATION +\defbibcheck{Presentation}{% + \ifentrytype{presentation}{}{\skipentry}% +} +\defbibcheck{Presentation:Contributed}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{presentationtype}{contributed}{}{\skipentry}% +} +\defbibcheck{Presentation:Internal}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{presentationtype}{internal}{}{\skipentry}% +} +\defbibcheck{Presentation:Invited}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{presentationtype}{invited}{}{\skipentry}% +} +\defbibcheck{Presentation:Job}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{presentationtype}{job}{}{\skipentry}% +} +\defbibcheck{Presentation:Keynote}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{presentationtype}{keynote}{}{\skipentry} +} +\defbibcheck{Presentation:NotInternalOrJob}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{presentationtype}{internal}{\skipentry}{% + \iffieldequalstr{presentationtype}{job}{\skipentry}{}% + }% +} + +\defbibcheck{Presentation:Poster}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{poster}{}{\skipentry}% +} +\defbibcheck{Presentation:PosterContributed}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{poster}{}{\skipentry}% + \iffieldequalstr{presentationtype}{contributed}{}{\skipentry}% +} +\defbibcheck{Presentation:PosterInternal}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{poster}{}{\skipentry}% + \iffieldequalstr{presentationtype}{internal}{}{\skipentry}% +} +\defbibcheck{Presentation:PosterInvited}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{poster}{}{\skipentry}% + \iffieldequalstr{presentationtype}{invited}{}{\skipentry}% +} +\defbibcheck{Presentation:PosterJob}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{poster}{}{\skipentry}% + \iffieldequalstr{presentationtype}{job}{}{\skipentry}% +} +\defbibcheck{Presentation:PosterKeynote}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{poster}{}{\skipentry}% + \iffieldequalstr{presentationtype}{keynote}{}{\skipentry} +} +\defbibcheck{Presentation:PosterNotInternalOrJob}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{poster}{}{\skipentry}% + \iffieldequalstr{presentationtype}{internal}{\skipentry}{% + \iffieldequalstr{presentationtype}{job}{\skipentry}{}% + }% +} + +\defbibcheck{Presentation:Talk}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{talk}{}{\skipentry}% +} +\defbibcheck{Presentation:TalkContributed}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{talk}{}{\skipentry}% + \iffieldequalstr{presentationtype}{contributed}{}{\skipentry}% +} +\defbibcheck{Presentation:TalkInternal}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{talk}{}{\skipentry}% + \iffieldequalstr{presentationtype}{internal}{}{\skipentry}% +} +\defbibcheck{Presentation:TalkInvited}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{talk}{}{\skipentry}% + \iffieldequalstr{presentationtype}{invited}{}{\skipentry}% +} +\defbibcheck{Presentation:TalkJob}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{talk}{}{\skipentry}% + \iffieldequalstr{presentationtype}{job}{}{\skipentry}% +} +\defbibcheck{Presentation:TalkKeynote}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{talk}{}{\skipentry}% + \iffieldequalstr{presentationtype}{keynote}{}{\skipentry} +} +\defbibcheck{Presentation:TalkNotInternalOrJob}{% + \ifentrytype{presentation}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{talk}{}{\skipentry}% + \iffieldequalstr{presentationtype}{internal}{\skipentry}{% + \iffieldequalstr{presentationtype}{job}{\skipentry}{}% + }% +} + +% STUDENT +\defbibcheck{Student}{% + \ifentrytype{student}{}{\skipentry}% +} +\defbibcheck{Student:Masters}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{masters}{}{\skipentry}% +} +\defbibcheck{Student:Phd}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{phd}{}{\skipentry}% +} +\defbibcheck{Student:Postdoc}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{postdoc}{}{\skipentry}% +} +\defbibcheck{Student:Undergraduate}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{undergraduate}{}{\skipentry}% +} +\defbibcheck{Student:NotUndergraduate}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{undergraduate}{\skipentry}{}% +} +\defbibcheck{Student:Externalexaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{role}{externalexaminer}{}{\skipentry}% +} +\defbibcheck{Student:Internalexaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{role}{internalexaminer}{}{\skipentry}% +} +\defbibcheck{Student:Secondsupervisor}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{role}{secondsupervisor}{}{\skipentry}% +} +\defbibcheck{Student:Supervisor}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{role}{supervisor}{}{\skipentry}% +} +\defbibcheck{Student:NotExaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{role}{internalexaminer}{\skipentry}{}% + \iffieldequalstr{role}{externalexaminer}{\skipentry}{}% +} +\defbibcheck{Student:MastersExternalexaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{masters}{}{\skipentry}% + \iffieldequalstr{role}{externalexaminer}{}{\skipentry}% +} +\defbibcheck{Student:MastersInternalexaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{masters}{}{\skipentry}% + \iffieldequalstr{role}{internalexaminer}{}{\skipentry}% +} +\defbibcheck{Student:MastersSecondsupervisor}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{masters}{}{\skipentry}% + \iffieldequalstr{role}{secondsupervisor}{}{\skipentry}% +} +\defbibcheck{Student:MastersSupervisor}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{masters}{}{\skipentry}% + \iffieldequalstr{role}{supervisor}{}{\skipentry}% +} +\defbibcheck{Student:MastersNotExaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{masters}{}{\skipentry}% + \iffieldequalstr{role}{internalexaminer}{\skipentry}{}% + \iffieldequalstr{role}{externalexaminer}{\skipentry}{}% +} +\defbibcheck{Student:PhdExternalexaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{phd}{}{\skipentry}% + \iffieldequalstr{role}{externalexaminer}{}{\skipentry}% +} +\defbibcheck{Student:PhdInternalexaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{phd}{}{\skipentry}% + \iffieldequalstr{role}{internalexaminer}{}{\skipentry}% +} +\defbibcheck{Student:PhdSecondsupervisor}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{phd}{}{\skipentry}% + \iffieldequalstr{role}{secondsupervisor}{}{\skipentry}% +} +\defbibcheck{Student:PhdSupervisor}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{phd}{}{\skipentry}% + \iffieldequalstr{role}{supervisor}{}{\skipentry}% +} +\defbibcheck{Student:PhdNotExaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{phd}{}{\skipentry}% + \iffieldequalstr{role}{internalexaminer}{\skipentry}{}% + \iffieldequalstr{role}{externalexaminer}{\skipentry}{}% +} +\defbibcheck{Student:PostdocExternalexaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{postdoc}{}{\skipentry}% + \iffieldequalstr{role}{externalexaminer}{}{\skipentry}% +} +\defbibcheck{Student:PostdocInternalexaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{postdoc}{}{\skipentry}% + \iffieldequalstr{role}{internalexaminer}{}{\skipentry}% +} +\defbibcheck{Student:PostdocSecondsupervisor}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{postdoc}{}{\skipentry}% + \iffieldequalstr{role}{secondsupervisor}{}{\skipentry}% +} +\defbibcheck{Student:PostdocSupervisor}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{postdoc}{}{\skipentry}% + \iffieldequalstr{role}{supervisor}{}{\skipentry}% +} +\defbibcheck{Student:PostdocNotExaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{postdoc}{}{\skipentry}% + \iffieldequalstr{role}{internalexaminer}{\skipentry}{}% + \iffieldequalstr{role}{externalexaminer}{\skipentry}{}% +} +\defbibcheck{Student:UndergraduateExternalexaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{undergraduate}{}{\skipentry}% + \iffieldequalstr{role}{externalexaminer}{}{\skipentry}% +} +\defbibcheck{Student:UndergraduateInternalexaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{undergraduate}{}{\skipentry}% + \iffieldequalstr{role}{internalexaminer}{}{\skipentry}% +} +\defbibcheck{Student:UndergraduateSecondsupervisor}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{undergraduate}{}{\skipentry}% + \iffieldequalstr{role}{secondsupervisor}{}{\skipentry}% +} +\defbibcheck{Student:UndergraduateSupervisor}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{undergraduate}{}{\skipentry}% + \iffieldequalstr{role}{supervisor}{}{\skipentry}% +} +\defbibcheck{Student:UndergraduateNotExaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{undergraduate}{}{\skipentry}% + \iffieldequalstr{role}{internalexaminer}{\skipentry}{}% + \iffieldequalstr{role}{externalexaminer}{\skipentry}{}% +} +\defbibcheck{Student:NotUndergraduateExternalexaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{undergraduate}{\skipentry}{}% + \iffieldequalstr{role}{externalexaminer}{}{\skipentry}% +} +\defbibcheck{Student:NotUndergraduateInternalexaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{undergraduate}{\skipentry}{}% + \iffieldequalstr{role}{internalexaminer}{}{\skipentry}% +} +\defbibcheck{Student:NotUndergraduateSecondsupervisor}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{undergraduate}{\skipentry}{}% + \iffieldequalstr{role}{secondsupervisor}{}{\skipentry}% +} +\defbibcheck{Student:NotUndergraduateSupervisor}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{undergraduate}{\skipentry}{}% + \iffieldequalstr{role}{supervisor}{}{\skipentry}% +} +\defbibcheck{Student:NotUndergraduateNotExaminer}{% + \ifentrytype{student}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{undergraduate}{\skipentry}{}% + \iffieldequalstr{role}{internalexaminer}{\skipentry}{}% + \iffieldequalstr{role}{externalexaminer}{\skipentry}{}% +} + +% TEACHING +\defbibcheck{Teaching}{% + \ifentrytype{teaching}{}{\skipentry}% +} +\defbibcheck{Teaching:Graduate}{% + \ifentrytype{teaching}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{graduate}{}{\skipentry}% +} +\defbibcheck{Teaching:Undergraduate}{% + \ifentrytype{teaching}{}{\skipentry}% + \iffieldequalstr{entrysubtype}{undergraduate}{}{\skipentry}% +} + +% Create a biblatex/biber MD5 hash from the parts of a name and store the hashes so that the name can be emphasized and/or deleted throughout the CV. If seems like \zap@space and ExplSyntax do not play nice together. There is probably a much cleaner way of doing this. Basically, the \highlightname macro concatenates the name parts, strips any spaces, calculates the hash, and then converts the hash to all lower case letters. The code does not handle periods in the name the same way that biblatex/biber does and therefore the input to \highlightname should probably not have periods. +\newcommand{\highlightname}[4]{% family, given, prefix, suffix + \edef\cv@blx@highlightname@hash{\zap@space #1#2#3#4 \@empty}% + \ifxetex% + \expandafter\edef\expandafter\cv@blx@highlightname@hash\expandafter{% + \expandafter\mdfivesum\expandafter{% + \cv@blx@highlightname@hash% + }% + }% + \else% + \expandafter\edef\expandafter\cv@blx@highlightname@hash\expandafter{% + \expandafter\pdfmdfivesum\expandafter{% + \cv@blx@highlightname@hash% + }% + }% + \fi% + \cv@blx@highlightname% +} + +\ExplSyntaxOn + \newcommand{\cv@blx@highlightname}{% + \edef\cv@blx@highlightname@hash{% + \text_lowercase:n{\cv@blx@highlightname@hash}% + }% + \listxadd{\cv@blx@highlightname@hash@list}{% + \cv@blx@highlightname@hash% + }% + } +\ExplSyntaxOff + +% Emphasized a name throughout the CV. We patch the name formats and not the underlying bib macros, since this allows us to compare the name hash instead of the name parts. This seems more robust to things like initials and different name ordering schemes +\newcommand{\cv@blx@highlightname@format}{\textbf} +\newcommand{\cv@blx@highlightname@patch}{% + \begingroup% Needs to be ended by an \xapptonameformat + \xifinlist{\thefield{hash}}{\cv@blx@highlightname@hash@list}{% + \let\mkbibnamegiven=\cv@blx@highlightname@format% + \let\mkbibnamefamily=\cv@blx@highlightname@format% + \let\mkbibnameprefix=\cv@blx@highlightname@format% + \let\mkbibnamesuffix=\cv@blx@highlightname@format% + }{}% +} +\xpretonameformat{given-family}{\cv@blx@highlightname@patch}{}{} +\xapptonameformat{given-family}{\endgroup}{}{} +\xpretonameformat{family-given}{\cv@blx@highlightname@patch}{}{} +\xapptonameformat{family-given}{\endgroup}{}{} +\xpretonameformat{family-given/given-family}{\cv@blx@highlightname@patch}{}{} +\xapptonameformat{family-given/given-family}{\endgroup}{}{} +\xpretonameformat{initsonly}{\cv@blx@highlightname@patch}{}{} +\xapptonameformat{initsonly}{\endgroup}{}{} + +% Delete a name from a list of names. Unlike the emphasizing the name, the deletion is done on a per type (i.e., author, editor, presenter) basis. +\newcommand{\cv@blx@deletename}[1]{% + \expandafter\forlistloop\expandafter{\expandafter\cv@blx@deletename@do\expandafter{\NewValue}{#1}}{\cv@blx@highlightname@hash@list}% +} +\ExplSyntaxOn + \NewDocumentCommand{\cv@blx@deletename@do}{mmm}{% Name information, Type, Hash + \tl_set:Nn\l_tmpa_tl{#1}% + \str_if_in:nnTF{#1}{hash=#3}{% + \numdef\NewCount{\NewCount-1}% + \regex_replace_all:nnN{\cB\{\cB\{.*?hash=#3.*?\cE\}\cE\}\cE\}}{}\l_tmpa_tl% + \regex_replace_all:nnN{\cB\{\cB\{.*?hash=#3.*?\cE\}.*?givenun=0.*?\cE\}\cE\}}{}\l_tmpa_tl% + \edef\NewValue{\l_tmpa_tl}% + \blx@bbl@addfield{#2deleted}{1}% + }{}% + } +\ExplSyntaxOff + +\newbibmacro{nameDeleted}{% + \iffieldequalstr{\currentname deleted}{1}{% + \bibstring{with}\addspace% + }{% + \bibstring{by}\addspace% + }% +} +\renewcommand{\cv@blx@tempa}[1]{% + \DeclareNameInputHandler{#1}{% + \iftoggle{cv@blx:delete:#1}{\cv@blx@deletename{#1}}{}% + }% + \DeclareNameWrapperFormat{#1}{% + \iftoggle{cv@blx:delete:#1}{\usebibmacro{nameDeleted}}{}% + ##1% + }% +} +\forcsvlist{\cv@blx@tempa}{afterword, annotator, author, bookauthor, % + commentator, editor, editora, editorb, editorc, foreword, holder, % + introduction, namea, nameb, namec, translator, shortauthor, % + shorteditor, advisor, committee, name, presenter% +} + +% Some sections of a CV should have numbered items and some should not. We need to define unnumbered and numbered (with descending labels) bibliography environments. In order for this to work, we need to create a new totcounter every time a new bibliography is started. I think this breaks if there is more than one refsection in the CV, but I am not sure why there would be more than one refsection in a CV. +\newcounter{cv@blx@bib} +\newtotcounter{cv@blx@ref@0} +\xpatchcmd{\printbibliography}{\begingroup}{% + \stepcounter{cv@blx@bib}% + \edef\@tempa{cv@blx@ref@\arabic{cv@blx@bib}}% + \expandafter\newtotcounter\expandafter{\@tempa}% + \begingroup +}{}{} + +\newrobustcmd{\mkbibdown}[1]{% + \stepcounter{cv@blx@ref@\arabic{cv@blx@bib}}% + \begingroup% + \edef\@tempa{cv@blx@ref@\arabic{cv@blx@bib}}% + \number\numexpr% + \expandafter\totvalue\expandafter{\@tempa}+1-#1% + \relax% + \endgroup% +} + +\DeclareFieldFormat{labelnumber}{\mkbibdown{#1}} +\DeclareFieldFormat{labelnumberwidth}{\mkbibbrackets{#1}} + +\newcommand{\cv@blx@list}{% + \setlength{\labelwidth}{\labelnumberwidth}% + \setlength{\leftmargin}{\labelwidth}% + \setlength{\labelsep}{\biblabelsep}% + \addtolength{\leftmargin}{\labelsep}% + \setlength{\itemsep}{\bibitemsep}% + \setlength{\parsep}{\bibparsep}% + \addtolength{\leftmargin}{\bibhang}% + \setlength{\itemindent}{-\bibhang}% +} + +\newcommand{\cv@blx@sublist}{% + \setlength{\labelwidth}{\labelnumberwidth}% + \setlength{\leftmargin}{\labelwidth}% + \setlength{\labelsep}{\biblabelsep}% + \addtolength{\leftmargin}{\labelsep}% + \setlength{\itemsep}{\bibitemsep}% + \setlength{\parsep}{\bibparsep}% + \addtolength{\leftmargin}{2\bibhang}% + \setlength{\itemindent}{-\bibhang}% +} + +\defbibenvironment{numbered}{% + \list{% + \printtext[labelnumberwidth]{% + \printfield{prefixnumber}% + \printfield{labelnumber}% + }% + }{\cv@blx@list}% + \renewcommand*{\makelabel}[1]{\hss##1}% +}{\endlist}{\item} + +\defbibenvironment{unnumbered}{% + \list{}{\cv@blx@list}% + \renewcommand*{\makelabel}[1]{\hss##1}% +}{\endlist}{\item} + +% Data inheritances need to be defined for the related types +\DeclareDataInheritance{committee}{committee}{ + \inherit{entrysubtype}{entrysubtype} + \noinherit{semesters} +} + +\DeclareDataInheritance{school}{degree}{ + \noinherit{degreelist} + \noinherit{gpa} +} + +\DeclareDataInheritance{teaching}{teaching}{ + \inherit{entrysubtype}{entrysubtype} +} + +% Deal with the verbose style options +\iftoggle{cv@blx:verbose:committee}{ + \DeclareStyleSourcemap{ + \maps[datatype = bibtex]{ + \map[overwrite]{ + \pertype{committee} + \step[fieldsource = semesters, fieldset = options, + fieldvalue = {skipbib = true}] + } + } + } +}{ + \DeclareStyleSourcemap{ + \maps[datatype = bibtex]{ + \map[overwrite]{ + \pertype{committee} + \step[fieldsource = crossref, fieldset = options, + fieldvalue = {skipbib = true}] + } + } + } +} + +\DeclareStyleSourcemap{ + \maps[datatype = bibtex]{ + \map[overwrite]{ + \pertype{teaching} + \step[fieldsource = crossref, fieldset = options, + fieldvalue = {skipbib = true}] + } + } + \maps[datatype = bibtex]{ + \map[overwrite]{ + \pertype{degree} + \step[fieldsource = crossref, fieldset = options, + fieldvalue = {skipbib = true}] + } + } +} + +\iftoggle{cv@blx:verbose:education}{ + \toggletrue{cv@blx:education:advisor} + \toggletrue{cv@blx:education:committee} + \toggletrue{cv@blx:education:gpa} + \toggletrue{cv@blx:education:honors} + \toggletrue{cv@blx:education:major} + \toggletrue{cv@blx:education:minor} + \toggletrue{cv@blx:education:title} +}{} diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-cv/doc/biblatex-cv.bib b/macros/latex/contrib/biblatex-contrib/biblatex-cv/doc/biblatex-cv.bib new file mode 100644 index 0000000000..98583e3777 --- /dev/null +++ b/macros/latex/contrib/biblatex-contrib/biblatex-cv/doc/biblatex-cv.bib @@ -0,0 +1,347 @@ +%@Abstract{Abstract:, + %Author = {}, + %Title = {}, + %Journaltitle = {}, + %Date = {}, + %Entrysubtype = {}, + %PresentationType = {}, + %Presenter = {}, +%} + +%@Committee{Committee:, + %Date = {}, + %Entrysubtype = {}, + %Title = {}, + %Institution = {}, + %Location = {}, + %Department = {}, + %Role = {}, + %Semesters = {}, + %crossref = {}, +%} + +%@School{School:, + %Date = {}, + %Institution = {}, + %Location = {}, + %Department = {}, + %GPA = {}, + %Honors = {}, + %DegreeList = {}, +%} + +%@Degree{Degree:, + %Date = {}, + %Institution = {}, + %Location = {}, + %Department = {}, + %Degree = {}, + %GPA = {}, + %Honors = {}, + %Concentration = {}, + %Advisor = {}, + %Committee = {}, + %Title = {}, + %crossref = {}, +%} + +%@Funding{Funding:, + %Date = {}, + %Entrysubtype = {}, + %Status = {}, + %Author = {}, + %Funder = {}, + %Title = {}, + %Role = {}, + %Amount = {}, + %Currency = {}, + %Number = {}, + %Type = {}, +%} + +%@Presentation{Presentation:, + %Date = {}, + %Entrysubtype = {}, + %Author = {}, + %PresentationType = {}, + %Presenter = {}, + %Title = {}, + %Institution = {}, + %Location = {}, + %Department = {}, +%} + +%@Student{Student:, + %Date = {}, + %Entrysubtype = {}, + %Name = {}, + %Role = {}, + %Institution = {}, + %Location = {}, + %Department = {}, +%} + +%@Teaching{Teaching:, + %Date = {}, + %Entrysubtype = {}, + %Title = {}, + %Department = {}, + %Institution = {}, + %Location = {}, + %Number = {}, + %NumLectures = {}, + %NumStudents = {}, + %Role = {}, + %classes = {}, +%} + +@XData{Author:Me, + Author = {Doe, Jon}, +} + +@XData{Author:Us, + Author = {Doe, Jon and Smith, Alice and Jones, Bob}, +} + +@XData{Author:Them, + Author = {Smith, Alice and Jones, Bob}, +} + +@XData{Institution:Departmental, + Institution = {My Institution}, + Location = {My City}, + Department = {My Department}, +} + +@XData{Institution:External, + Institution = {Their Institution}, + Location = {Their City}, + Department = {Their Department}, +} + +@XData{Institution:Institutional, + Institution = {My Institution}, + Location = {My City}, +} + +@XData{Presenters:Me, + Presenter = {Doe, Jon}, +} + +@XData{Presenters:Us, + Presenter = {Doe, Jon and Smith, Alice and Jones, Bob}, +} + +@XData{Presenters:Them, + Presenter = {Smith, Alice and Jones, Bob}, +} + +@Abstract{Abstract:PosterContributedJoint, + xdata = {Author:Us, Presenters:Me}, + Title = {A Contributed Poster Abstract}, + Journaltitle = {Journal of Poster Abstracts}, + Date = {2020-01-01}, + Entrysubtype = {poster}, + PresentationType = {contributed}, +} + +@Abstract{Abstract:TalkInternalSolo, + xdata = {Author:Them, Presenters:Them}, + Title = {An Internal Talk Abstract}, + Journaltitle = {Journal of Talk Abstracts}, + Date = {2019-01-01}, + Entrysubtype = {talk}, + PresentationType = {internal}, +} + +@Abstract{Abstract:TalkInvitedOther, + xdata = {Author:Me, Presenters:Us}, + Title = {An Invited Talk Abstract}, + Journaltitle = {Journal of Talk Abstracts}, + Date = {2018-01-01}, + Entrysubtype = {talk}, + PresentationType = {invited}, +} + +@Committee{Committee:Departmental, + Semesters = {Committee:DepartmentalSemesterA, Committee:DepartmentalSemesterB}, + xdata = {Institution:Departmental}, + Date = {2010-23/2019-21}, + Entrysubtype = {departmental}, + Title = {An Example Departmental Committee With Semesters}, + + Role = {}, +} + +@Committee{Committee:DepartmentalSemesterA, + crossref = {Committee:Departmental}, + Date = {2010-23/2015-21}, + Role = {Secretary}, +} + +@Committee{Committee:DepartmentalSemesterB, + crossref = {Committee:Departmental}, + Date = {2015-22/2019-21}, + Role = {Chair}, +} + +@Committee{Committee:External, + xdata = {Institution:External}, + Date = {2015-23}, + Entrysubtype = {external}, + Title = {An Example External Committee Without Semesters}, + Role = {Consultant}, +} + +@Committee{Committee:Institutional, + xdata = {Institution:Institutional}, + Date = {2017-21/2019-22}, + Entrysubtype = {institutional}, + Title = {An Example Institutional}, + Role = {}, +} + +@School{School:Degree, + Date = {2010-23/2019-21}, + Institution = {My Institution}, + Location = {My City}, + GPA = {3.5}, + Honors = {Institution Honors}, + DegreeList = {Degree:MS, Degree:PhD}, +} + +@Degree{Degree:PhD, + Date = {2019-21}, + Department = {My PhD Department}, + Degree = {PhD}, + GPA = {4.0}, + Honors = {PhD Honors}, + Concentration = {PhD Concentration}, + Advisor = {Jones, Alice}, + Committee = {Jones, Alice and Smith, Bob}, + Title = {My PhD Title}, + crossref = {School:Degree}, +} + +@Degree{Degree:MS, + Date = {2012-21}, + Department = {My MS Department}, + Degree = {MS}, + GPA = {3.0}, + Advisor = {Smith, Bob}, + Committee = {Jones, Alice and Smith, Bob}, + Title = {My MS Title}, + crossref = {School:Degree}, +} + +@School{School:NoDegree, + xdata = {Institution:External}, + Date = {2009-21}, + GPA = {2.0}, + Honors = {My Other Honors}, +} + +@Funding{Funding:IndividualOngoing, + xdata = {Author:Us}, + Date = {2019-01/2021-01}, + Entrysubtype = {individual}, + Status = {ongoing}, + Funder = {Funding Agency}, + Title = {A Grant Title}, + Role = {pi}, + Amount = {100,000,000}, + Currency = {\$}, + Number = {123-456-abc}, + Type = {Research Grant}, +} + +@Funding{Funding:InstitutionalCompleted, + xdata = {Author:Us}, + Date = {2010-01/2019-01}, + Entrysubtype = {Institutional}, + Status = {completed}, + Funder = {A Different Funding Agency}, + Title = {A Different Grant Title}, + Role = {ci}, + Amount = {1,000,000}, + Currency = {\pounds}, + Number = {abc-def-123}, + Type = {Fellowship}, +} + + +@Presentation{Presentation:PosterContributedJoint, + xdata = {Author:Us, Presenters:Me, Institution:External}, + Title = {A Contributed Poster Presentation}, + Date = {2020-01-01}, + Entrysubtype = {poster}, + PresentationType = {contributed}, +} + +@Presentation{Presentation:TalkInternalSolo, + xdata = {Author:Them, Presenters:Them, Institution:Departmental}, + Title = {A Departmental Talk Presentation}, + Date = {2019-01-01}, + Entrysubtype = {talk}, + PresentationType = {internal}, +} + +@Presentation{Presentation:TalkInvitedOther, + xdata = {Author:Me, Presenters:Us, Institution:Institutional}, + Title = {An Institutional Invited Talk Presentation}, + Date = {2018-01-01}, + Entrysubtype = {talk}, + PresentationType = {invited}, +} + +@Student{Student:SupervisorMS, + xdata = {Institution:Departmental}, + Date = {2018-23/2020-21}, + Entrysubtype = {masters}, + Name = {Smith, Alice}, + Role = {supervisor}, +} + +@Student{Student:InternalExaminerPhD, + xdata = {Institution:External}, + Date = {2016-24/2018-22}, + Entrysubtype = {phd}, + Name = {Jones, Bob}, + Role = {internalexaminer}, +} + +@Teaching{Teaching:Graduate, + xdata = {Institution:Departmental}, + Date = {2020-23}, + Entrysubtype = {graduate}, + Title = {A Graduate Class}, + Number = {EE401}, + NumLectures = {36}, + NumStudents = {100}, + Role = {Instructor of Record}, +} + +@Teaching{Teaching:Undergraduate, + xdata = {Institution:Departmental}, + Date = {2019-21/2020-22}, + Entrysubtype = {undergraduate}, + Title = {An Undergraduate Class}, + Number = {EE101}, + classes = {Teaching:Undergraduate20, Teaching:Undergraduate19}, +} + +@Teaching{Teaching:Undergraduate20, + crossref = {Teaching:Undergraduate}, + Date = {2020-22}, + NumLectures = {36}, + NumStudents = {100}, + Role = {Instructor of Record}, +} + +@Teaching{Teaching:Undergraduate19, + crossref = {Teaching:Undergraduate}, + Date = {2019-21}, + NumLectures = {13}, + NumStudents = {10}, + Role = {ta}, +} diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-cv/doc/biblatex-cv.pdf b/macros/latex/contrib/biblatex-contrib/biblatex-cv/doc/biblatex-cv.pdf Binary files differnew file mode 100644 index 0000000000..6e7a8eb1b4 --- /dev/null +++ b/macros/latex/contrib/biblatex-contrib/biblatex-cv/doc/biblatex-cv.pdf diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-cv/doc/biblatex-cv.tex b/macros/latex/contrib/biblatex-contrib/biblatex-cv/doc/biblatex-cv.tex new file mode 100644 index 0000000000..0417630b45 --- /dev/null +++ b/macros/latex/contrib/biblatex-contrib/biblatex-cv/doc/biblatex-cv.tex @@ -0,0 +1,416 @@ +% The header to this document is based on the biblatex.tex document. The ordering and style of the documentation also is based on biblatex.tex. +\documentclass{ltxdockit}[2011/03/25] +\usepackage{btxdockit} +\usepackage{fontspec} +\usepackage{hyperref} +\usepackage{zref-xr} + +\setmonofont{Courier New} +\setmainfont[Ligatures=TeX]{Linux Libertine O} +\setsansfont[Ligatures=TeX]{Linux Biolinum O} +\usepackage[american]{babel} +\usepackage[strict]{csquotes} +\usepackage{tabularx} +\usepackage{longtable} +\usepackage{booktabs} +\usepackage{shortvrb} +\usepackage{pifont} +\usepackage{microtype} +\usepackage{typearea} +\usepackage{mdframed} +\areaset[current]{370pt}{700pt} +\lstset{ + basicstyle=\ttfamily, + keepspaces=true, + upquote=true, + frame=single, + breaklines=true, + postbreak=\raisebox{0ex}[0ex][0ex]{\ensuremath{\color{red}\hookrightarrow\space}} +} +\KOMAoptions{numbers=noenddot} +\addtokomafont{title}{\sffamily} +\addtokomafont{disposition}{\spotcolor} +\addtokomafont{descriptionlabel}{\spotcolor} +\setkomafont{caption}{\bfseries\sffamily\spotcolor} +\setkomafont{captionlabel}{\bfseries\sffamily\spotcolor} +\pretocmd{\cmd}{\sloppy}{}{} +\pretocmd{\bibfield}{\sloppy}{}{} +\pretocmd{\bibtype}{\sloppy}{}{} +\makeatletter +\RedeclareSectionCommand[% + beforeskip=-3.25ex\@plus -1ex \@minus -.2ex,% + afterskip=1.5ex \@plus .2ex,% +]{paragraph} +\RedeclareSectionCommand[% + beforeskip=-3.25ex\@plus -1ex \@minus -.2ex,% + indent=\z@,% +]{subparagraph} +\makeatother + +\MakeAutoQuote{«}{»} +\MakeAutoQuote*{<}{>} + +% DES: Moved turning \| into a shorthand for verbatim material until later since it breaks something in the biblatex package + +\newcommand*{\allowbreakhere}{\discretionary{}{}{}} + +\newcommand*{\biber}{\sty{biber}\xspace} +\newcommand*{\biblatex}{\sty{biblatex}\xspace} +\newcommand*{\biblatexml}{\sty{biblatexml}\xspace} +\newcommand*{\biblatexhome}{http://sourceforge.net/projects/biblatex/} +\newcommand*{\biblatexctan}{http://ctan.org/pkg/biblatex/} + +% DES: Moved \titlepage and \hypersetup to the end of the preamble + +% tables + +\newcolumntype{H}{>{\sffamily\bfseries\spotcolor}l} +\newcolumntype{L}{>{\raggedright\let\\=\tabularnewline}p} +\newcolumntype{R}{>{\raggedleft\let\\=\tabularnewline}p} +\newcolumntype{C}{>{\centering\let\\=\tabularnewline}p} +\newcolumntype{V}{>{\raggedright\let\\=\tabularnewline\ttfamily}p} + +\newcommand*{\sorttablesetup}{% + \tablesetup + \ttfamily + \def\new{\makebox[1.25em][r]{\ensuremath\rightarrow}\,}% + \def\alt{\par\makebox[1.25em][r]{\ensuremath\hookrightarrow}\,}% + \def\note##1{\textrm{##1}}} + +\newcommand{\tickmarkyes}{\Pisymbol{psy}{183}} +\newcommand{\tickmarkno}{\textendash} +\providecommand*{\textln}[1]{#1} +\providecommand*{\lnstyle}{} + +% markup and misc + +\setcounter{secnumdepth}{4} + +\makeatletter + +\newenvironment{nameparts} + {\trivlist\item + \tabular{@{}ll@{}}} + {\endtabular\endtrivlist} + +\newenvironment{namedelims} + {\trivlist\item + \tabularx{\textwidth}{@{}c@{=}l>{\raggedright\let\\=\tabularnewline}X@{}}} + {\endtabularx\endtrivlist} + +\newenvironment{namesample} + {\def\delim##1##2{\@delim{##1}{\normalfont\tiny\bfseries##2}}% + \def\@delim##1##2{{% + \setbox\@tempboxa\hbox{##1}% + \@tempdima=\wd\@tempboxa + \wd\@tempboxa=\z@ + \box\@tempboxa + \begingroup\spotcolor + \setbox\@tempboxa\hb@xt@\@tempdima{\hss##2\hss}% + \vrule\lower1.25ex\box\@tempboxa + \endgroup}}% + \ttfamily\trivlist + \setlength\itemsep{0.5\baselineskip}} + {\endtrivlist} + +\makeatother + +\newrobustcmd*{\Deprecated}{% + \textcolor{spot}{\margnotefont Deprecated}} +\newrobustcmd*{\DeprecatedMark}{% + \leavevmode\marginpar{\Deprecated}} +\newrobustcmd*{\LF}{% + \textcolor{spot}{\margnotefont Label field}} +\newrobustcmd*{\LFMark}{% + \leavevmode\marginpar{\LF}} +\newrobustcmd*{\CSdelim}{% + \textcolor{spot}{\margnotefont Context Sensitive}} +\newrobustcmd*{\CSdelimMark}{% + \leavevmode\marginpar{\CSdelim}} + + +\newcommand*{\seestyleexample}[1]{% + \leavevmode + \marginpar{% + \raggedright + \footnotesize + Style example:\\ + \href{file:examples/#1.pdf}{local}, + \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/examples/#1.pdf} + {online}.}% + \ignorespaces} + +% following snippet is based on code by Michael Ummels (TeX Stack Exchange) +% <http://tex.stackexchange.com/a/13073/8305> +\makeatletter + \newcommand\fnurl@[1]{\footnote{\url@{#1}}} + \DeclareRobustCommand{\fnurl}{\hyper@normalise\fnurl@} +\makeatother + +\hyphenation{% + star-red + bib-lio-gra-phy + white-space +} + +% DES: Begin additions/changes to biblatex.tex preamble +\titlepage{% + title={Bib\LaTeX\ Style for Creating a Curriculum Vitae}, + subtitle={Datatypes and Formatting Macros}, + url={https://github.com/danielshub/biblatex-cv/}, + author={Daniel E. Shub}, + email={daniel.e.shub@gmail.com}, + revision={0.01}, + date={\today}% +} + +\hypersetup{% + pdftitle={The biblatex-cv manual}, + pdfsubject={Bib\LaTeX\ Style for Creating a Curriculum Vitae}, + pdfauthor={Daniel E. Shub}, + pdfkeywords={latex, biblatex, cv, style} +} + +\usepackage{biblatex-cv} +\highlightname{Doe}{Jon}{}{} +\addbibresource{biblatex-cv.bib} + +\newcommand{\exampitem}[1]{\begingroup% + \par\itemsep0.5\itemsep\item% + Default Output: \par% + \printbibliography[env = unnumbered, resetnumbers = true, check = #1]% +\endgroup} + +\MakeShortVerb{\|} + +\begin{document} +\nocite{*} +\printtitlepage +\tableofcontents + +\section{Introduction} +\subsection{About} +This package is a \biblatex\ style for creating an academic curriculum vitae (CV) from a \bibtex\ \file{.bib} file using \biber\slash\biblatex. In addition to the standard publication types, an academic CV contains information about funding, teaching, mentoring, and other accomplishments. Depending on the purpose of the CV, the grouping of the items within a category changes. For example, when applying for jobs, it is often desirable to group teaching by whether it is at the undergraduate or graduate level (or maybe by class size), but when applying for promotion, you may need to group teaching depending on if the classes were inside/outside your department. The same goes for mentoring. In some cases it may make sense to group by the program/department the students/post-docs were enrolled and in other cases it may make sense to group undergraduate students separately. The purpose of this package is to harness the power of \biber\slash\biblatex\ to automatically group items on a CV and ensure consistent formatting of those items. The package implements a citation style (\file{biblatex-cv.cbx}), a references section style (\file{biblatex-cv.bbx}), a data model (\file{biblatex-cv.dbx}) that includes enhancements and additional entry types over the standard data model, and a string localization file (\file{american-cv.lbx}). It also includes a standard \latex\ package (\file{biblatex-cv.sty}) which provides useful interfaces for grouping items on the CV. Localization support is provided for CV specific strings in the accompanying \file{american-cv.lbx} file. + +The \sty{biblatex-cv} data model includes a number of additional entry types beyond those provided by the standard \biblatex\ data model. The \sty{biblatex-cv} data model, however, does not include all possible entry types that might appear on a CV. For example, it lacks an entry type related to employment, even though every CV likely includes employment history. The additional data types that are included in the \sty{biblatex-cv} data model were chosen based on the perceived likelihood that an individual might want to tailor the formatting, grouping, and/or ordering of the items of a particular entry type for a particular purpose. Future versions of the \sty{biblatex-cv} data model will likely include additional entry types and hopefully someday it will be possible to fully generate an academic CV directly from a \file{.bib} file. + +\subsection{License} +Copyright \textcopyright\ 2020-- Daniel E. Shub. Permission is granted to copy, distribute and\slash or modify this software under the terms of the \lppl, version~1.3.\fnurl{http://www.latex-project.org/lppl.txt}. The current maintainer is Daniel Shub. + +\subsection{Feedback} +Bug reports, comments and ideas are welcome. Please use the project page on GitHub to report bugs and submit feature requests.\fnurl{https://github.com/danielshub/biblatex-cv/}. + +\subsection{Acknowledgments} +This package was motivated by the amazing improvements \bibtex\slash\biblatex\ provides over \bibtex\ for managing bibliographies. The data model and formatting macros provided by \biblatex\ allows a user with a good working knowledge of \latex\ to design new bibliography and citation styles. The \sty{biblatex-publist}\fnurl{https://github.com/jspitz/biblatex-publist} style provided a lot of inspiration of for this package and shows the flexiblity of \biblatex. + +\section{Use} +This package is available at \url{https://github.com/danielshub/biblatex-cv/}. To install manually, you can download it and then put the \file{.cbx}, \file{.bbx}, \file{.lbx}, \file{.dbx}, and \file{.sty} files in your texmf tree (???). An example document is provided at the end of this document, but briefly, you specify the style in the usual way when loading \biblatex. While the style can be loaded just like any other \biblatex\ style, it is best to load it with |\usepackage{biblatex-cv}|. The \sty{biblatex-cv} package loads \biblatex\ with useful options as well as providing macros that are useful for grouping items in a CV. It can be loaded with: + +\begin{ltxcode} +\usepackage[american]{babel} +\usepackage{biblatex-cv} +\end{ltxcode} + +\subsection{Package options} +The verbosity of the output can be controlled by passing options to \sty{biblatex-cv}. These options include +\begin{ltxcode} +verbose-committee +verbose-education +verbose-teaching +verbose-lists +\end{ltxcode} + +\noindent The options |verbose-committee|, |verbose-education|, and |verbose-teaching| respectively control how verbose the lists of committees, education, and teaching are. The |verbose-lists| option is the same as passing |verbose-committee|, |verbose-education|, and |verbose-teaching|. + +\subsection{Package and Base Styles} + The citation style (\path{biblatex-cv.cbx}) is an unmodified version of the \biblatex\ |authoryear| citation style. The bibliography style (\path{biblatex-cv.bbx}) is based on the corresponding \biblatex\ |authoryear| style, but it patches a couple of the standard macros to provide additional functionality. The bibliography style essentially just adds bibliography drivers for the new entry types and provides a number of |toggles| to control the information that is presented. These |toggles| are in the form |cv@blx@ENTRYTYPE:FIELD|. The package (\path{biblatex-cv.sty}) provides macros for controlling the grouping and format of the items on the CV. The |\highlightname| macro is used to identify a particular name for special treatment. By default the name is made bold face in lists of authors and deleted from lists of presenters. The package also provides |numbered| and |unnumbered| bibliography environments. The numbers decrease in the |numbered| environment. + +\section{Database Guide} +This package contains the following files: +\begin{description} + \item[\path{american-cv.lbx}] The |biblatex-cv| localization files. This file provides language-specific macros for some fixed strings commonly used in academic CVs. + \item[\path{biblatex-cv.bbx}] The \sty{biblatex-cv} bibliography style. It is based on the standard \biblatex\ |authoryear| style but provides bibliography drivers for the new entry types and some minor modifications to the standard entry types. + \item[\path{biblatex-cv.bib}] The \file{.bib} entries used to provided the examples in this document. + \item[\path{biblatex-cv.cbx}] The \sty{biblatex-cv} citations style. It is just the standard \biblatex\ |authoryear| style. + \item[\path{biblatex-cv.dbx}] The \sty{biblatex-cv} data model. It is based on the standard \biblatex\ data model but provides enhancements and additional entry types to allow users to utilize more natural entry type and field names for certain entries. + \item[\path{biblatex-cv.sty}] A \latex\ package that provides macros for controlling the grouping and format of the items on the CV. + \item[\path{biblatex-cv.tex}] This document. + \item[\path{cv.tex}] An example CV populated by the entries in \path{biblatex-cv.bib}. +\end{description} + +\subsection{New Entry Types} +This section gives an overview of the novel entry types supported by the \sty{biblatex-cv} package data model along with the fields supported by each type. The lists below indicate the fields supported by each entry type. Note that the <required> fields are not strictly required in all cases. The fields marked as <optional> are optional in a technical sense. The \sty{biblatex-cv} package data model defines a few constraints for the format of certain fields. These are only validated against the data model with \biber's \opt{--validate-datamodel} option, however, the grouping features provided by the \sty{biblatex-cv} package assume the data model has been validated. Some generic fields like \bibfield{abstract} and \bibfield{annotation} or \bibfield{label} and \bibfield{shorthand} are not included in the lists below because they are independent of the entry type. See the \sty{biblatex-cv} data model specification in the file \file{biblatex-cv.dbx} for a complete specification. + +\begin{typelist} + \typeitem{abstract} + A published abstract in a journal, proceedings, or other location. While an abstract is often associated with a presentation, only a single entry should be made in the database since there is no way to automatically suppress the duplicate output. This entry type nearly identical to the \bibtype{article} entry type except it has the additional mandatory fields \bibfield{entrysubtype}, \bibfield{presentationtype}, and \bibfield{presenter}. The output format is also similar to that of the \bibtype{article} entry type. To work with the built in bibliography filters, the field \bibfield{entrysubtype} is constrained to be |poster| or |talk|. + \reqitem{author, title, journaltitle, year/date, entrysubtype, presentationtype, presenter} + \optitem{translator, annotator, commentator, subtitle, titleaddon, editor, editora, editorb, editorc, journalsubtitle, issuetitle, issuesubtitle, language, origlanguage, series, volume, number, eid, issue, month, pages, version, note, issn, addendum, pubstate, doi, eprint, eprintclass, eprinttype, url, urldate} + \exampitem{Abstract} + + \typeitem{committee} + A committee entry is designed to reflect administrative service committees that have been served on. The field \bibfield{title} is the name of the committee. To work with the built in bibliography filters, the field \bibfield{entrysubtype} is constrained to be |departmental|, |external|, or |institutional|. + \reqitem{date, entrysubtype, title, institution} + \optitem{location, department, role, semesters} + \exampitem{Committee} + + \typeitem{school} + A school is place where one studied and possibly earned a \bibtype{degree}. It is closely coupled with the \bibtype{degree} entry type. + \reqitem{date, institution, location} + \optitem{department, degreelist, gpa, honors} + + \typeitem{degree} + A degree is something you earn at a \bibtype{school}. It is closely coupled with the \bibtype{school} entry type. + \reqitem{date, institution, location} + \optitem{department, degree, gpa, honors, major, minor, concentration, advisor, committee, title} + \exampitem{Education} + + \typeitem{funding} + An entry type for recording funding and grants. To work with the built in bibliography filters, the field \bibfield{entrysubtype} is constrained to be |individual| or |institutional| and the field \bibfield{status} is constrained to be |completed|, |ongoing|, |pending|, |submitted|, or |unsuccessful|. + \reqitem{date, entrysubtype, status, author, funder} + \optitem{title, role, amount, currency, number, type} + \exampitem{Funding} + + \typeitem{presentation} + A typically unpublished presentation from a conference or seminar, or other event. While a presentation is often associated with an abstract, only a single entry should be made in the database since there is no way to automatically suppress the duplicate output. To work with the built in bibliography filters, the field \bibfield{entrysubtype} is constrained to be |poster| or |talk|. + \reqitem{date, entrysubtype, author, presentationtype, presenter, title, institution, location} + \optitem{department} + \exampitem{Presentation} + + \typeitem{student} + An entry type for students and other individuals that you hae been a mentor to or examined. To work with the built in bibliography filters, the field \bibfield{entrysubtype} is constrained to be |masters|, |phd|, |postdoc|, or |undergraduate| and the field \bibfield{role} is constrained to be |externalexaminer|, |internalexaminer|, |secondsupervisor|, or |supervisor|. + \reqitem{date, entrysubtype, role, name, institution, location} + \optitem{department} + \exampitem{Student} + + \typeitem{teaching} + An entry type for classes that you have taught. To work with the built in bibliography filters, the field \bibfield{entrysubtype} is constrained to be |graduate| or |undergraduate|. The optional field \bibfield{classes} can be used in conjunction with the field \bibfield{crossref} when you have taught multiple sections of a particular class or have taught it over multiple years. + \reqitem{date, entrysubtype, title, department, institution, location} + \optitem{number, numlectures, numstudents, role, classes} + \exampitem{Teaching} + +\end{typelist} + +\subsection{Modified Entry Types} +This section gives an overview of the modifications made to the standard entry types. Changes have been made to both the underlying data model and its constraints as well as the bibliography drivers and the underlying macros that format the output. The bibliography drivers for all entry types except the \bibtype{shorthand} and \bibtype{set} entry types, have been modified to not print the field \bibfield{note} in the standard location, but rather before the page reference and related type information. The field \bibfield{note} is now provided along with bibliometric information. The bibliometrics information is currently limited to the field \bibfield{numcites}. + +\begin{typelist} + \typeitem{article} + This is the standard \bibtype{article} entry type modified to have an additional mandatory field \bibfield{numcites}. + \typeitem{unpublished} + This is the standard \bibtype{unpublished} entry type modified to have an additional optional field \bibfield{journaltitle}. + \typeitem{unpublished} + This is the standard \bibtype{thesis} entry type but modified to work with the built in bibliography filters by constraining the field \bibfield{type} to be |doctoralthesis|, |mastersthesis|, or |undergradthesis|. +\end{typelist} + +\subsection{New Entry Fields} +\begin{fieldlist} + \listitem{advisor}{name} The advisor(s) for the entry type \bibtype{degree}. + + \listitem{committee}{name} The committee member(s) for the entry type \bibtype{degree}. + + \listitem{name}{name} The name of the student for the entry type \bibtype{student}. While technically a list, it is probably not advisable to use it as such and each \bibtype{student} entry should be for a single student. + + \listitem{presenter}{name} The presenter(s) of a piece of work for the entry types \bibtype{abstract} and \bibtype{presentation}. + + \listitem{concentration}{literal} A list of concentration areas for the entry type \bibtype{degree}. + + \listitem{honors}{literal} A list of honors associated with the entry type \bibtype{degree}. + + \listitem{minor}{literal} A list of minors associated with the entry type \bibtype{degree}. + + \fielditem{amount}{integer} The amount of money for the entry type \bibtype{funding}. + + \fielditem{numcites}{integer} The number of citations for a particular item. + + \fielditem{numlectures}{integer} The number of lectures/classes for the entry type \bibtype{teaching}. + + \fielditem{numstudents}{integer} The number of students in a class for the entry type \bibtype{teaching}. + + \fielditem{currency}{literal} The currency of the field \bibfield{amount}. + + \fielditem{degree}{literal} The degree earned for the entry type \bibtype{degree}. + + \fielditem{department}{literal} An additional field that allows finer grain control of the \bibfield{institution} and \bibfield{location}. Unlike \bibfield{institution} and \bibfield{location}, \bibfield{department} is a field and not a list. + + \fielditem{funder}{literal} The name of the funding institute for the entry type \bibtype{funding}. + + \fielditem{gpa}{literal} The grade point average for the entry types \bibtype{degree} and \bibtype{school}. + + \fielditem{major}{literal} The major for the entry type \bibtype{degree}. + + + \fielditem{presentationtype}{literal} The type of presentation for the entry types \bibtype{abstract} and \bibtype{presentation}. To work with the built in bibliography filters, the field should be constrained to be |contributed|, |internal|, |invited|, |job|, or |keynote|. + + \fielditem{role}{key} The role (e.g., chair or secretary) that was served for entry type \bibtype{committee}. + + \fielditem{status}{key} The status of the entry type \bibtype{funding}. + + \fielditem{classes}{separated list of entrykeys} A comma separated list of keys to other \bibtype{teaching} entries. This can be useful if you taught a class multiple semesters and/or multiple sections of a class. + + \fielditem{degreelist}{separated list of entrykeys} A comma separated list of \bibtype{degree} entries earned at the corresponding \bibtype{school}. + + \fielditem{semesters}{separated list of entrykeys} a comma separated list of keys to other committee entries. This can be useful if you served on a committee for multiple years serving different roles. + +\end{fieldlist} + +\section{Example} +The following example will create a boring looking CV. There is no reason you cannot make the formatting nicer. The purpose of this package is to control the sorting, grouping, and formatting of the items on the CV and not the CV itself. + +\begin{ltxcode} +\documentclass{article} +\usepackage[american]{babel} +\usepackage{biblatex-cv} + +\highlightname{Doe}{Jon}{}{} +\addbibresource{biblatex-cv.bib} + +\begin{document} + \nocite{*} + \section*{Education} + \printbibliography[env = unnumbered, resetnumbers = true, check = Education] + + \section*{Funding} + \printbibliography[env = numbered, resetnumbers = true, check = Funding] + + \section*{Abstracts} + \printbibliography[env = numbered, resetnumbers = true, check = Abstract] + + \section*{Research Presentations} + \printbibliography[env = numbered, resetnumbers = true, check = Presentation] + + \section*{Teaching} + \printbibliography[env = unnumbered, resetnumbers = true, check = Teaching] + + \section*{Service} + \printbibliography[env = unnumbered, resetnumbers = true, check = Committee] + + \section*{Mentoring} + \printbibliography[env = unnumbered, resetnumbers = true, check = Student] +\end{document} +\end{ltxcode} + +If instead of showing all your teaching together, you want to group by graduate and undergraduate teaching, that is as simply as changing |check = Teaching| to |check = Teaching:Graduate| and |check = Teaching:Undergraduate|. Grouping by the institute where the teaching was done is a little harder, since we do not know where you have taught. First you have to define the checks: +\begin{ltxcode} +\defbibcheck{Teaching:Oxford}{% + \ifentrytype{teaching}{}{\skipentry}% + \iffieldequalstr{institution}{Oxford}{}{\skipentry}% +} +\defbibcheck{Teaching:Cambridge}{% + \ifentrytype{teaching}{}{\skipentry}% + \iffieldequalstr{institution}{Cambridge}{}{\skipentry}% +} +\end{ltxcode} + +\noindent and then you can use |check = Teaching:Oxford| and |check = Teaching:Cambridge|. Of course if you group by university, you may not want to include the university in the reference. That can be controlled with |\togglefalse{cv@blx:teaching:institution}| and if you want to get rid of the department and location, there are toggles for that too. There are lots of checks and toggles predefined in \sty{biblatex-cv}. just look through the \file{biblatex-cv.sty} to see if what you need exists. If not, there is hopefully an example that will get you close. +\end{document} + +% arara: clean: { extensions: [ aux, bbl, bcf, blg, out, run.xml, toc ] } +% arara: clean: { extensions: [ log, pdf ] } +% arara: xelatex: { options: [ '-halt-on-error' ], interaction: batchmode } +% arara: biber: { options: [ '--validate_datamodel' ] } +% arara: xelatex: { options: [ '-halt-on-error' ], interaction: batchmode } +% arara: --> until !found('log', 'Rerun to get cross-references right.') +% arara: --> && !found('log', 'There were undefined references.') +% arara: clean: { extensions: [ aux, bbl, bcf, blg, out, run.xml, toc ] } +% arara: clean: { extensions: [ log ] } diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-cv/doc/cv.pdf b/macros/latex/contrib/biblatex-contrib/biblatex-cv/doc/cv.pdf Binary files differnew file mode 100644 index 0000000000..43a922c32c --- /dev/null +++ b/macros/latex/contrib/biblatex-contrib/biblatex-cv/doc/cv.pdf diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-cv/doc/cv.tex b/macros/latex/contrib/biblatex-contrib/biblatex-cv/doc/cv.tex new file mode 100644 index 0000000000..bb1fc0a10b --- /dev/null +++ b/macros/latex/contrib/biblatex-contrib/biblatex-cv/doc/cv.tex @@ -0,0 +1,40 @@ +\documentclass{article} +\usepackage[american]{babel} +\usepackage{biblatex-cv} + +\highlightname{Doe}{Jon}{}{} +\addbibresource{biblatex-cv.bib} + +\begin{document} + \nocite{*} + \section*{Education} + \printbibliography[env = unnumbered, resetnumbers = true, check = Education] + + \section*{Funding} + \printbibliography[env = numbered, resetnumbers = true, check = Funding] + + \section*{Abstracts} + \printbibliography[env = numbered, resetnumbers = true, check = Abstract] + + \section*{Research Presentations} + \printbibliography[env = numbered, resetnumbers = true, check = Presentation] + + \section*{Teaching} + \printbibliography[env = unnumbered, resetnumbers = true, check = Teaching] + + \section*{Service} + \printbibliography[env = unnumbered, resetnumbers = true, check = Committee] + + \section*{Mentoring} + \printbibliography[env = unnumbered, resetnumbers = true, check = Student] +\end{document} + +% arara: clean: { extensions: [ aux, bbl, bcf, blg, out, run.xml, toc ] } +% arara: clean: { extensions: [ log, pdf ] } +% arara: pdflatex: { options: [ '-halt-on-error' ], interaction: batchmode } +% arara: biber: { options: [ '--validate_datamodel' ] } +% arara: pdflatex: { options: [ '-halt-on-error' ], interaction: batchmode } +% arara: --> until !found('log', 'Rerun to get cross-references right.') +% arara: --> && !found('log', 'There were undefined references.') +% arara: clean: { extensions: [ aux, bbl, bcf, blg, out, run.xml, toc ] } +% arara: clean: { extensions: [ log ] } diff --git a/macros/latex/contrib/easybook/easybook.dtx b/macros/latex/contrib/easybook/easybook.dtx index ad29040915..c89a99181f 100644 --- a/macros/latex/contrib/easybook/easybook.dtx +++ b/macros/latex/contrib/easybook/easybook.dtx @@ -23,11 +23,12 @@ % % \changes{v1.20}{2021/01/09}{修改和完善用户文档。} % \changes{v1.20}{2021/01/09}{模板更改为使用 CC-BY 许可协议。} -% \changes{v1.25p}{2021/05/03}{取消附带的示例文件,可查看历史版本及其它来源的使用样例。} +% \changes{v1.25q}{2021/05/03}{取消附带的示例文件,可查看历史版本及其它来源的使用样例。} +% \changes{v1.25q}{2021/06/02}{将模块的代码独立出来为 \pkg{easybase} 宏包,适用于 \CTeX 文档类。} % % \title{\sffamily easybook 文档类手册} % \author{瞿毅} -% \date{2021/05/31\hskip\ccwd\relax v1.25p\thanks{\url{https://gitee.com/texl3/easybook}}} +% \date{2021/06/02\hskip\ccwd\relax v1.25q\thanks{\url{https://gitee.com/texl3/easybook}}} % % \maketitle % \begin{abstract} @@ -57,6 +58,22 @@ % \end{document} % \end{frameverb} % +% 或者直接使用 \pkg{easybase} 宏包,它的宏包选项有 \opt{class} 和 \opt{draft},包含了节 \ref{sec:interface options} 所示各个模块接口命令的功能,目前只适用于 \cls{ctexbook} 和 \cls{ctexart} 文档类。 +% \begin{frameverb} +% \documentclass{ctexbook} +% +% \usepackage{easybase} +% \ctexset{键值列表} +% +% \usepackage{宏包列表} +% +% \begin{document} +% \chapter{欢迎} +% \section{Welcome to easybook} +% Hello, \LaTeX +% \end{document} +% \end{frameverb} +% % \subsection{编译方式} % 假设您的 \TeX 源文件名为 \opt{easybook.tex},需要使用参考文献和索引功能,并使用 \hologo{XeLaTeX} 和 \hologo{BibTeX} 引擎编译文档,那么需要在命令行中执行 % \begin{frameverb} @@ -117,7 +134,7 @@ % \end{syntax} % 传递给 \cls{ctexbook} 设置字体,最好不要使用原有的 \opt{fontset} 选项,默认情况下使用自定义字体而不开启这个选项,可根据安装的字体及电脑系统选取。\opt{noto} 与 \opt{none} 选项的相关描述见小节 \ref{subsec:font settings},\opt{overleaf} 是一个各系统通用选项,会检测系统环境选取对应字体。 % \changes{v1.21}{2021/01/12}{默认字体与 \CTeX 一致,不再是自定义字体。} -% \changes{v1.25p}{2021/05/04}{修复使用 \pkg{xeCJK} 与 \pkg{fontspec} 宏包的字体设置命令在 \hologo{LuaLaTeX} 下失效的问题。} +% \changes{v1.25q}{2021/05/04}{修复使用 \pkg{xeCJK} 与 \pkg{fontspec} 宏包的字体设置命令在 \hologo{LuaLaTeX} 下失效的问题。} % \end{function} % % \begin{function}[rEXP,added = 2021-01-05,updated = 2021-01-13]{paper} @@ -140,11 +157,10 @@ % \begin{syntax} % class = <(book)|article> % \end{syntax} -% 设置文类风格,默认为 \opt{book} 文档类。选用 \opt{article} 会变为 \opt{oneside} 单面排版,同时使文档编号、结构等与标准 \cls{article} 文档类的特性相似,可用于短篇幅的文章,不需要再使用 \tn{chapter} 命令,此时设置双栏目录的 \opt{style/multoc} 选项、小节 \ref{subsec:document command} 中打印目录命令的 \opt{multoc} 及 \opt{book} 选项均会失效,会以 \opt{section} 标题级别输出目录。 +% 设置文类风格,默认为 \opt{book} 文档类。选用 \opt{article} 会变为 \opt{oneside} 单面排版,同时使文档编号、结构等与标准 \cls{article} 文档类的特性相似,可用于短篇幅的文章,不需要再使用 \tn{chapter} 命令,此时设置双栏目录的 \opt{style/multoc} 选项、小节 \ref{subsec:document command} 中打印目录命令的 \opt{multoc} 及 \opt{book} 选项均会失效,会以 \opt{section} 标题级别输出目录。如果使用 \cls{ctexart} 配合 \pkg{easybase} 宏包,则 \opt{book} 宏包选项会失效。 % \changes{v1.23}{2021/03/16}{增加 article 文章模式,可用于短篇幅的文章。} % \end{function} % -% \clearpage % \subsection{文档命令} % \label{subsec:document command} % \subsubsection{文区命令} @@ -160,7 +176,7 @@ % \end{function} % % \subsubsection{目录命令} -% \begin{function}[added = 2021-02-20,updated = 2021-05-05]{\tableofcontents,\listoffigures,\listoftables,\listoflistings} +% \begin{function}[added = 2021-02-20,updated = 2021-06-02]{\tableofcontents,\listoffigures,\listoftables,\listoflistings} % \begin{syntax} % \tn{tableofcontents+}\oarg{键值列表}\parg{附加代码} % \tn{listoffigures*+}\oarg{键值列表} @@ -168,22 +184,24 @@ % \tn{listoflistings*+}\oarg{键值列表} % \end{syntax} % \tn{listoffigures} 命令输出图片目录,\tn{listoftables} 输出表格目录,\tn{listoflistings} 输出代码目录。带有星号的目录命令不将标题添加进主文档目录,带有+号的目录命令可以使当前标题编号。\tn{tableofcontents+} 与其它命令不同是用于输出双语目录,需要与双语目录标题命令 \tn{bichapter} 等或设置图片、表格和代码等英文目录的标题配合使用,附加代码是中文与英文目录之间的代码,可以插入文本和换页命令等。目录的键值列表选项如下 -% \changes{v1.25p}{2021/05/05}{命令 \tn{tableofcontents} 可以输出双语目录。} +% \changes{v1.25q}{2021/05/05}{命令 \tn{tableofcontents} 可以输出双语目录。} % \end{function} % -% \begin{function}{multoc,title,format,aftertitle,pagestyle,book,article} +% \begin{function}{multoc,columns,title,format,aftertitle,pagestyle,book,article} % \begin{syntax} % multoc = <true|(false)> +% columns = <目录栏数|(2)> % title = \{<中文目录标题>,<英文目录标题>\} % format = <目录标题格式> % aftertitle = <目录标题后的代码> % pagestyle = <标题页的页面格式> % \end{syntax} -% \opt{multoc} 与 \opt{style/multoc} 选项具有相同的效果,但是具有优先性且可单独设置不同目录是否双栏排版。\opt{title} 选项用于更改目录的标题,标题之间用一个半角逗号分开,也可以只有一部分,表示中文目录的标题。当设置了英文目录标题时,英文目录标题将会自动加入主文档目录,与 \tn{tableofcontents+} 配合输出。 +% \opt{multoc} 与 \opt{style/multoc} 选项具有相同的效果,但是具有优先性且可单独设置不同目录是否多栏排版,默认为双栏,可使用 \opt{columns} 更改。\opt{title} 选项用于更改目录的标题,标题之间用一个半角逗号分开,也可以只有一部分,表示中文目录的标题。当设置了英文目录标题时,英文目录标题将会自动加入主文档目录,与 \tn{tableofcontents+} 配合输出。 % % 在书籍模式且 \opt{book} 选项开启或者文章模式的情况下,\opt{format} 用于设置目录标题的格式,\opt{aftertitle} 选项的代码将被插入到目录标题内容之后,\opt{pagestyle} 是目录标题所在页的页面格式,除此之外还支持 \opt{ctexset/chapter} 或 \opt{ctexset/section} 所有的章节标题样式选项。\opt{book} 选项使目录标题按照 chapter 级别输出,\opt{article} 选项使目录标题按照 section 级别输出,默认为 chapter 级别。 % \changes{v1.23}{2021/03/15}{为几个目录增加键值列表的选项,可设置标题输出级别以及是否加入主目录。} % \changes{v1.24}{2021/04/04}{目录命令的可选参数增加标题键值。} +% \changes{v1.25q}{2021/06/02}{目录可设置多栏,并在 article 模式仍然生效。} % \end{function} % % \subsubsection{标题命令} @@ -199,7 +217,7 @@ % 双语目录的标题命令目前设置了常用的三个级别,它们将中文标题正常输出,并使中英文标题加入双语目录,这个功能是为国内一些大学的学位论文模板的要求设计,在一般情况和英文模式下不需要使用。 % % 它们的星号变体命令使文中标题不编号,但是仍然加入双语目录,若英文标题参数空置那么仅加入中文目录而不加入英文目录,这一特点与 \tn{chapter*} 等命令的行为不太一样,在一些情况下会用到。可选参数是目录中的中文标题,默认与中文标题一致,正文标题过长时可用它设置在目录中显示的标题。双语目录的格式是一致的,共享使用 \tn{tocset} 的设置,英文目录的章级别标题名及编号的修改方式如下 -% \changes{v1.25p}{2021/05/05}{增加与双语目录配合的标题命令。} +% \changes{v1.25q}{2021/05/05}{增加与双语目录配合的标题命令。} % \end{function} % % \begin{function}{biname,binmuber} @@ -272,7 +290,7 @@ % \changes{v1.10}{2021/01/08}{可以自定义主题颜色。} % \end{function} % \item[color-all] 统一设置主题的各部分颜色,参数是6个十六进制数字组成的 HTML 颜色代码,任意颜色的代码可以在常见的图片处理工具拾色器中查看。 -% \item[multoc] 开启双栏目录,可与 \opt{onecolumn} 和 \opt{twocolumn} 选项配合出单栏正文、单栏目录,双栏正文、单栏目录,单栏正文、双栏目录和双栏正文、双栏目录四种方式。 +% \item[multoc] 开启多栏目录,与小节 \ref{subsec:document command} 中目录命令的同名选项有相同效果。 % \item[withpart] 使章跟随每一部分编号,默认不跟随。 % \item[footwith] 使脚注跟随编号的计数器,默认跟随章,当开启新的一章时脚注编号从1开始。 % \item[rulewidth] 调整页眉、定理盒子以及代码框线条的粗细。 @@ -299,7 +317,7 @@ % \changes{v1.10}{2021/01/08}{修复了 \opt{linktopage} 选项关闭时目录中标题编号无超链接的问题。} % \changes{v1.23}{2021/03/19}{修复在 \pkg{ctex} v2.5.6 更新后 \cls{easybook} 与 \pkg{hyperref} 冲突问题。} % \changes{v1.24}{2021/04/05}{增加 \pkg{hyperref} 超链接选项完整的支持。} -% \changes{v1.25p}{2021/05/06}{模块名 \opt{link} 改为 \opt{refset},\opt{link} 作为兼容性保留。} +% \changes{v1.25q}{2021/05/06}{模块名 \opt{link} 改为 \opt{refset},\opt{link} 作为兼容性保留。} % \end{function} % % \begin{optdesc} @@ -356,7 +374,7 @@ % \ding{229} 以上选项路径为 \opt{subfont/...} % \changes{v1.10}{2021/01/08}{加入自定义非正文字体选项。} % \changes{v1.23}{2021/02/08}{修复使用 \tn{zihao} 命令设置字体失效的问题。} -% \changes{v1.25p}{2021/05/31}{其它字体模块名由 \opt{elsefont} 改为 \opt{subfont},并增加数学字体的选项 \opt{subfont/math}。} +% \changes{v1.25q}{2021/05/31}{其它字体模块名由 \opt{elsefont} 改为 \opt{subfont},并增加数学字体的选项 \opt{subfont/math}。} % \end{function} % % \begin{optdesc} @@ -381,7 +399,7 @@ % \changes{v1.21}{2021/01/11}{增加 \opt{bibset} 选项,可以使用 \hologo{BibTeX} 或 \hologo{biber} 编译参考文献。} % \changes{v1.23}{2021/02/23}{使用 \opt{bibset} 选项时可设置标注风格。} % \changes{v1.24}{2021/04/09}{可以不载入参考文献包手动配置参考文献格式。} -% \changes{v1.25p}{2021/05/12}{取消 \opt{bib-loadpkg} 选项,由是否设置参考文献数据库来决定载入宏包。} +% \changes{v1.25q}{2021/05/12}{取消 \opt{bib-loadpkg} 选项,由是否设置参考文献数据库来决定载入宏包。} % \end{function} % % \begin{optdesc} @@ -490,8 +508,10 @@ % % \subsection{页面尺寸} % \label{subsec:page margins} -% \begin{function}[EXP,added = 2021-01-13,updated = 2021-05-11]{left,top,hmargin,textwidth,includehead} +% \begin{function}[EXP,added = 2021-01-13,updated = 2021-06-02]{headruleskip,footruleskip,left,top,hmargin,textwidth,includehead} % \begin{syntax} +% headruleskip = <页眉线间距> +% footruleskip = <页脚线间距> % left = <页面左边距> % top = <页面上边距> % hmargin = \marg{左边距,右边距} @@ -499,17 +519,18 @@ % includehead = <true|(false)> % \end{syntax} % \ding{229} 以上选项路径为 \opt{geoset/...} \\ -% 预置的页面尺寸与 \cls{Word} 的默认值接近,\opt{geoset} 会将选项交给 \pkg{geometry} 宏包接口命令 \tn{geometry} 处理,并且选项的键值列表与之相同,上面的选项仅是一小部分,支持的参数可查阅宏包帮助文档。当在此设置页面大小时,会覆盖 \opt{paper} 选项的设置。 +% 预置的页面尺寸与 \cls{Word} 的默认值接近,\opt{geoset} 会将前两个之外的选项交给 \pkg{geometry} 宏包接口命令 \tn{geometry} 处理,并且选项的键值列表与之相同,上面的选项仅是一小部分,支持的参数可查阅宏包帮助文档。当在此设置页面大小时,会覆盖 \opt{paper} 选项的设置。 % \changes{v1.21}{2021/01/13}{增加配置页面尺寸的选项。} % \end{function} % % \begin{ctexexam} % \geoset % { -% top = 2.5cm, -% bottom = 2.5cm, -% left = 3.2cm, -% right = 3.2cm, +% headruleskip = 3pt, +% top = 2.5cm, +% bottom = 2.5cm, +% left = 3.2cm, +% right = 3.2cm, % ignoreall % } % \end{ctexexam} @@ -584,7 +605,7 @@ % 上面几个选项用于设置脚注格式,\opt{fnparskip} 和 \opt{fnparindent} 选项仅在 \opt{fnhang = true} 时有效。\opt{fnhang} 用于将脚注设置为悬挂缩进的格式,\opt{fnmark-pos} 选项设置脚注编号的位置,正常文本或是上标形式。\opt{fnmark-num} 选项设置脚注编号的格式,默认为原生样式 \opt{plain},还可以改为 \opt{pifont} 的各个版本,从左往右依次为普通版、阴文衬线版、阳文无衬线版和阴文无衬线版,缺点是它们的编号仅包括1-10。 % % \opt{fnmark-form} 是脚注标记的格式,在此设置字体命令会覆盖 \opt{subfont/footnote} 的设置,最后一个格式命令可以带有一个参数,这个参数接受脚注编号,一般配合 \opt{fnmark-num = plain} 使用。\opt{afterfnmark} 是脚注标记后的代码,一般用于设置标记与文本间的距离。 -% \changes{v1.25p}{2021/05/12}{增加脚注样式设置选项。} +% \changes{v1.25q}{2021/05/12}{增加脚注样式设置选项。} % \end{function} % % \subsection{目录样式} @@ -603,7 +624,7 @@ % \opt{format} 是目录中标题的格式,可以设置字体和加入垂直间距等,垂直间距最好使用无间距重合的 \tn{addvspace} 命令,带有加号的 \opt{format+} 选项用于在已有的格式命令后附加内容。\opt{indent} 是目录中标题在页面左侧的缩进距离,应该有长度单位。\opt{rule} 选项中一般应当使用 \tn{tocrule} 命令,将会在接下来介绍。\opt{numsep} 是有编号的标题在目录中编号与标题的间距。 % \changes{v1.21}{2021/01/13}{增加配置目录样式的选项。} % \changes{v1.24}{2021/04/20}{增加目录中编号与标题的间距选项 \opt{numsep}。} -% \changes{v1.25p}{2021/05/14}{可以分别设置图片、表格和代码目录的格式。} +% \changes{v1.25q}{2021/05/14}{可以分别设置图片、表格和代码目录的格式。} % \end{function} % % \begin{function}[added = 2021-01-13,updated = 2021-04-20]{\tocrule,\EbNumberLine} @@ -688,7 +709,7 @@ % \tn{end}\marg{环境名} % \end{syntax} % \pkg{tabularray} 是一个较新的宏包,不仅提供了 \pkg{tabularx}、\pkg{multirow}、和 \pkg{booktabs} 宏包的功能,并且不依赖其它宏包与它们同时使用不会产生冲突,还实现了用简便的键值列表方式设置表格样式。目前除了表头斜线以及跨页功能存在不足,其它方面已满足对表格绝大多数格式的需求,具体用法可见宏包的说明文档。 -% \changes{v1.25p}{2021/05/17}{使用功能更便捷齐全的 \pkg{tabularray} 宏包设置表格样式。} +% \changes{v1.25q}{2021/05/17}{使用功能更便捷齐全的 \pkg{tabularray} 宏包设置表格样式。} % \end{function} % % \subsection{列表} @@ -852,7 +873,7 @@ % \tn{qtyrange}\oarg{键值列表}\marg{数字1}\marg{数字2}\marg{单位} % \end{syntax} % \pkg{siunitx} 宏包的 \tn{num} 命令可以输出以科学计数法表示的数值,单位格式化命令 \tn{unit} 包含文字项目(例如字母或数字)时,使用 . 和 \~{} 放置在单元乘积中间,并使用 \_ 和 \^{} 正确放置指定的下标和上标。格式化方法可在数学和文本模式下使用。而 \tn{qty} 命令可用来输出带有单位的量,\tn{qtyrange} 可以输出带有范围和单位的量。 -% \changes{v1.25p}{2021/05/18}{\pkg{siunitx} 宏包 v3.0.0 更新后用法改变,修改相关配置选项。} +% \changes{v1.25q}{2021/05/18}{\pkg{siunitx} 宏包 v3.0.0 更新后用法改变,修改相关配置选项。} % \end{function} % % \begin{ctexexam} @@ -969,6 +990,7 @@ % \item[ulem] 提供可断行多样式的下划线命令。 % \item[geometry] 灵活完整的页面尺寸设置。 % \item[pdfpages] 在 \LaTeX 中插入 pdf 文档。 +% \item[multicol] 混合单栏和多栏排版。 % \item[graphicx] 增强了对图形插入的支持。 % \item[fancyhdr] 广泛控制页面的页眉和页脚。 % \item[titletoc] 设置目录中的标题格式。 @@ -988,42 +1010,8 @@ % \StopEventually{} %<*class> \NeedsTeXFormat{LaTeX2e}[2020/10/01] -\RequirePackage{l3keys2e,etoolbox} -\ProvidesExplClass{easybook}{2021/05/31}{1.25p}{beta} - -\cs_generate_variant:Nn \eb_ctex_define:nn { nx } -\cs_generate_variant:Nn \int_to_arabic:n { v } -\cs_generate_variant:Nn \dim_add:Nn { NV } -\cs_generate_variant:Nn \eb_put_hyperref:n { x } -\cs_generate_variant:Nn \seq_set_from_clist:Nn { No } -\cs_new_protected:Npn \eb_ctex_define:nn #1 - { \keys_define:nn { ctex/#1 } } -\cs_new_protected:Npn \eb_put_ctexbook:n #1 - { \PassOptionsToClass{#1}{ctexbook} } -\cs_new_protected:Npn \eb_patch_cmd:Nnn #1#2#3 - { - \ctex_patch_cmd_once:NnnnTF #1 { } {#2} {#3} - { } { \ctex_patch_failure:N #1 } - } -\cs_new_protected:Npn \eb_preto_cmd:Nn #1#2 - { - \ctex_preto_cmd:NnnTF #1 { } {#2} - { } { \ctex_patch_failure:N #1 } - } -\cs_new_protected:Npn \eb_appto_cmd:Nn #1#2 - { - \ctex_appto_cmd:NnnTF #1 { } {#2} - { } { \ctex_patch_failure:N #1 } - } -\cs_new_protected:Npn \eb_at_begin_environment:nn #1#2 - { - \seq_set_from_clist:No \l__eb_env_hook_name_seq {#1} - \seq_map_inline:Nn \l__eb_env_hook_name_seq - { \AtBeginEnvironment{##1}{#2} } - } -\cs_new_protected:Npn \eb_at_end_preamble:n - { \ctex_gadd_ltxhook:nn { env/document/before } } -\cs_gset_eq:NN \PackageWarning \use_none:nn +\RequirePackage{l3keys2e} +\ProvidesExplClass{easybook}{2021/06/02}{1.25q}{beta} \bool_set_false:N \l__eb_compile_draft_bool \bool_set_false:N \l__eb_title_newline_bool @@ -1032,6 +1020,8 @@ \bool_set_true:N \l__eb_class_book_bool \tl_new:N \g__eb_config_tl \clist_new:N \g__eb_options_clist +\cs_new_protected:Npn \eb_put_ctexbook:n #1 + { \PassOptionsToClass{#1}{ctexbook} } \keys_define:nn { easybook } { @@ -1087,6 +1077,249 @@ } \ProcessKeysOptions{easybook} +\eb_put_ctexbook:n { \g__eb_options_clist } +\LoadClass[UTF8]{ctexbook} + +\RequirePackage{easybase} +\ctex_at_end:n + { + \tl_if_empty:NF \g__eb_config_tl + { \file_input:n { \g__eb_config_tl } } + } + +\sys_if_engine_xetex:TF + { + \cs_new_eq:NN \eb_set_family:nnn \xeCJK_set_family:nnn + \cs_new_eq:NN \eb_switch_family:n \xeCJK_switch_family:n + } + { + \cs_new_eq:NN \eb_set_family:nnn \ctex_ltj_set_family:nnn + \cs_new_eq:NN \eb_switch_family:n \ctex_ltj_switch_family:n + } +\cs_new_protected:Npn \eb_font_double_engine_set:n #1 + { + \exp_args:Nc \RenewDocumentCommand {set#1font}{O{}mO{}} + {\use:c { eb_set#1font:nn } {##2} {##1,##3}} + } +\seq_const_from_clist:Nn \c__eb_font_reset_family_seq + { main,sans,mono,CJKmain,CJKsans,CJKmono } +\seq_map_inline:Nn \c__eb_font_reset_family_seq + { \eb_font_double_engine_set:n {#1} } + +\cs_new_protected:Npn \eb_setmainfont:nn #1#2 + { \__fontspec_main_setmainfont:nn {#2} {#1} } +\cs_new_protected:Npn \eb_setsansfont:nn #1#2 + { \__fontspec_main_setsansfont:nn {#2} {#1} } +\cs_new_protected:Npn \eb_setmonofont:nn #1#2 + { \__fontspec_main_setmonofont:nn {#2} {#1} } +\cs_new_protected:Npn \eb_setCJKmainfont:nn #1#2 + { \eb_set_family:nnn { \CJKrmdefault } {#2} {#1} } +\cs_new_protected:Npn \eb_setCJKsansfont:nn #1#2 + { \eb_set_family:nnn { \CJKsfdefault } {#2} {#1} } +\cs_new_protected:Npn \eb_setCJKmonofont:nn #1#2 + { \eb_set_family:nnn { \CJKttdefault } {#2} {#1} } +\cs_new_protected:Npn \eb_set_zhfont_songti:nn #1#2 + { \eb_set_family:nnn { songti } {#2} {#1} } +\cs_new_protected:Npn \eb_set_zhfont_heiti:nn #1#2 + { \eb_set_family:nnn { heiti } {#2} {#1} } +\cs_new_protected:Npn \eb_set_zhfont_kaishu:nn #1#2 + { \eb_set_family:nnn { kaishu } {#2} {#1} } +\cs_new_protected:Npn \eb_set_zhfont_fangsong:nn #1#2 + { \eb_set_family:nnn { fangsong } {#2} {#1} } + +\tl_const:Nn \eb_option_zhfont_tl + { UprightFont = *,AutoFakeBold = 1.5,ItalicFont = * } +\cs_new_protected:Npx \eb_setCJKmainfont:n #1 + { \eb_setCJKmainfont:nn {#1} { \eb_option_zhfont_tl } } +\cs_new_protected:Npx \eb_setCJKsansfont:n #1 + { \eb_setCJKsansfont:nn {#1} { \eb_option_zhfont_tl } } +\cs_new_protected:Npx \eb_setCJKmonofont:n #1 + { \eb_setCJKmonofont:nn {#1} { \eb_option_zhfont_tl } } +\cs_new_protected:Npx \eb_set_zhfont_songti:n #1 + { \eb_set_zhfont_songti:nn {#1} { \eb_option_zhfont_tl } } +\cs_new_protected:Npx \eb_set_zhfont_heiti:n #1 + { \eb_set_zhfont_heiti:nn {#1} { \eb_option_zhfont_tl } } +\cs_new_protected:Npx \eb_set_zhfont_kaishu:n #1 + { \eb_set_zhfont_kaishu:nn {#1} { \eb_option_zhfont_tl } } +\cs_new_protected:Npx \eb_set_zhfont_fangsong:n #1 + { \eb_set_zhfont_fangsong:nn {#1} { \eb_option_zhfont_tl } } + +\bool_if:NT \l__eb_font_noto_bool + { + \eb_setmainfont:nn { NotoSerif } + { + Extension = .ttf, + UprightFont = *-Regular, + BoldFont = *-Bold, + ItalicFont = *-Italic + } + \eb_setsansfont:nn { NotoSans } + { + Extension = .ttf, + UprightFont = *-Regular, + BoldFont = *-Bold, + ItalicFont = *-Italic + } + \eb_setmonofont:nn { NotoSansMono } + { + Extension = .ttf, + UprightFont = *-Regular, + BoldFont = *-Bold + } + \eb_setCJKmainfont:nn { FZShuSong-Z01S } + { + UprightFont = *, + BoldFont = FZHei-B01S, + ItalicFont = FZKai-Z03S + } + \eb_setCJKsansfont:n { FZHei-B01S } + \eb_setCJKmonofont:n { FZFangSong-Z02S } + \eb_set_zhfont_songti:n { FZShuSong-Z01S } + \eb_set_zhfont_heiti:n { FZHei-B01S } + \eb_set_zhfont_kaishu:n { FZKai-Z03S } + \eb_set_zhfont_fangsong:n { FZFangSong-Z02S } + \cs_new_protected:Npn \songti { \eb_switch_family:n { songti } } + \cs_new_protected:Npn \heiti { \eb_switch_family:n { heiti } } + \cs_new_protected:Npn \kaishu { \eb_switch_family:n { kaishu } } + \cs_new_protected:Npn \fangsong { \eb_switch_family:n { fangsong } } + } + +\ctex_set:n + { + secnumdepth = 3, + tocdepth = \bool_if:NTF \l__eb_class_book_bool { 1 } { 2 }, + part = + { + pagestyle = empty, + tocline = \EbNumberLine{#1}#2, + format = \color{ctex@frame}\sffamily\Huge, + aftername = + { + \bool_if:NTF \l__eb_title_newline_bool + { \par\nobreak } { \hspace{\ccwd} } + } + }, + chapter = + { + % pagestyle = fancy, + format = + { + \color{ctex@frame}\sffamily\LARGE + \bool_if:NF \l__eb_title_newline_bool { \centering } + }, + aftername = + { + \bool_if:NTF \l__eb_title_newline_bool + { \par\nobreak\vskip 1.5pc } { \hspace{\ccwd} } + }, + beforeskip = -1.5ex, + afterskip = 3ex, + lotskip = 0.8pc, + lofskip = 0.8pc + }, + section = + { + hang = true, + format = \color{ctex@frame}\sffamily\Large, + aftername = \hspace{0.5\ccwd}, + beforeskip = 1.5ex plus .2ex minus .1ex, + afterskip = 1.5ex plus .2ex minus .1ex + }, + subsection = + { + hang = true, + format = \color{ctex@frame}\sffamily\large, + aftername = \hspace{0.5\ccwd}, + beforeskip = 1.3ex plus .2ex minus .1ex, + afterskip = 1.3ex plus .2ex minus .1ex + }, + subsubsection = + { + hang = true, + format = \color{ctex@frame}\sffamily, + aftername = \hspace{0.5\ccwd}, + beforeskip = \parskip, + afterskip = \parskip + } + } + +\bool_if:NF \l__eb_title_newline_bool + { + \ctex_set:n + { + part/hang = true, + chapter/hang = true + } + } +%</class> +%<*package> +\NeedsTeXFormat{LaTeX2e}[2020/10/01] +\RequirePackage{etoolbox} +\ProvidesExplPackage{easybase}{2021/06/02}{1.25q}{beta} + +\cs_generate_variant:Nn \eb_ctex_define:nn { nx } +\cs_generate_variant:Nn \int_to_arabic:n { v } +\cs_generate_variant:Nn \dim_add:Nn { NV } +\cs_generate_variant:Nn \eb_put_hyperref:n { x } +\cs_generate_variant:Nn \seq_set_from_clist:Nn { No } +\cs_generate_variant:Nn \int_compare:nNnT { oNnT } +\cs_new_protected:Npn \eb_ctex_define:nn #1 + { \keys_define:nn { ctex/#1 } } +\cs_new_protected:Npn \eb_patch_cmd:Nnn #1#2#3 + { + \ctex_patch_cmd_once:NnnnTF #1 { } {#2} {#3} + { } { \ctex_patch_failure:N #1 } + } +\cs_new_protected:Npn \eb_preto_cmd:Nn #1#2 + { + \ctex_preto_cmd:NnnTF #1 { } {#2} + { } { \ctex_patch_failure:N #1 } + } +\cs_new_protected:Npn \eb_appto_cmd:Nn #1#2 + { + \ctex_appto_cmd:NnnTF #1 { } {#2} + { } { \ctex_patch_failure:N #1 } + } +\cs_new_protected:Npn \eb_at_begin_environment:nn #1#2 + { + \seq_set_from_clist:No \l__eb_env_hook_name_seq {#1} + \seq_map_inline:Nn \l__eb_env_hook_name_seq + { \AtBeginEnvironment{##1}{#2} } + } +\NewDocumentCommand{\eb@package@load}{O{}m} + { + \seq_set_from_clist:No \l__eb_package_name_seq {#2} + \int_compare:oNnT + { \seq_count:N \l__eb_package_name_seq } = { 1 } + { \PassOptionsToPackage{#1}{#2} } + \seq_map_inline:Nn \l__eb_package_name_seq + { \@ifpackageloaded{##1}{}{\RequirePackage{##1}} } + } +\cs_new_protected:Npn \eb_at_end_preamble:n + { \ctex_gadd_ltxhook:nn { env/document/before } } +\cs_gset_eq:NN \PackageWarning \use_none:nn + +\bool_if_exist:NF \l__eb_class_book_bool + { \bool_set_true:N \l__eb_class_book_bool } +\bool_if_exist:NF \l__eb_page_twoside_bool + { \bool_set_true:N \l__eb_page_twoside_bool } +\bool_if_exist:NF \l__eb_compile_draft_bool + { \bool_set_false:N \l__eb_compile_draft_bool } + +\keys_define:nn { easybase } + { + draft .code:n = + { \bool_set_true:N \l__eb_compile_draft_bool }, + + class .choice:, + class .value_required:n = true, + class/book .code:n = { }, + class/article .code:n = + { + \bool_set_false:N \l__eb_class_book_bool + \bool_set_false:N \l__eb_page_twoside_bool + } + } \clist_map_inline:nn { @@ -1098,13 +1331,12 @@ { shortlabels,inline } { enumitem }, { many } { tcolorbox }, { xindy } { imakeidx }, - { CJKmath = true } { xeCJK }, + { CJKmath } { xeCJK }, { no-math } { fontspec }, { upint } { newtxmath } } { \PassOptionsToPackage #1 } -\eb_put_ctexbook:n { \g__eb_options_clist } -\LoadClass[UTF8]{ctexbook} +\ProcessKeysOptions{easybase} \bool_new:N \l__eb_multoc_bool \bool_new:N \l__eb_uppercase_bool @@ -1137,7 +1369,7 @@ withpart .bool_set:N = \l__eb_chap_withpart_bool, withpart .default:n = true, withpart .initial:n = false, - rulewidth .dim_set:N = \l__eb_rule_width_dim, + rulewidth .dim_set:N = \eb@rule@width@dim, rulewidth .initial:n = 0.75pt, uppercase .bool_set:N = \l__eb_uppercase_bool, uppercase .default:n = true, @@ -1167,31 +1399,25 @@ number-sep .initial:n = { . } } -\RequirePackage +\eb@package@load { xcolor, footmisc,setspace, amsmath,amsthm,thmtools, chemformula,siunitx,ulem,pifont, geometry,marginnote,nccfoots, - pdfpages,graphicx, + pdfpages,graphicx,multicol, fancyhdr,titletoc,caption, tabularray, enumitem, listings } -\ctex_at_end:n - { - \tl_if_empty:NF \g__eb_config_tl - { \file_input:n { \g__eb_config_tl } } - } - \cs_new_protected:Npn \eb_package_later_bool:nn #1#2 { \@ifpackagelater{#1}{#2} - {}{\msg_warning:nnn { easybook } { package-old } {#1}} + {}{\msg_warning:nnn { easybase } { package-old } {#1}} } -\msg_new:nnn { easybook } { package-old } +\msg_new:nnn { easybase } { package-old } { Package~#1~has~been~out~of~date. \\ Some~problems~or~errors~may~occur \\ @@ -1210,109 +1436,12 @@ } { \eb_package_later_bool:nn #1 } -\sys_if_engine_xetex:TF - { - \cs_new_eq:NN \eb_set_family:nnn \xeCJK_set_family:nnn - \cs_new_eq:NN \eb_switch_family:n \xeCJK_switch_family:n - } - { - \cs_new_eq:NN \eb_set_family:nnn \ctex_ltj_set_family:nnn - \cs_new_eq:NN \eb_switch_family:n \ctex_ltj_switch_family:n - } -\cs_new_protected:Npn \eb_font_double_engine_set:n #1 - { - \exp_args:Nc \RenewDocumentCommand {set#1font}{O{}mO{}} - {\use:c { eb_set#1font:nn } {##2} {##1,##3}} - } -\seq_const_from_clist:Nn \c__eb_font_reset_family_seq - { main,sans,mono,CJKmain,CJKsans,CJKmono } -\seq_map_inline:Nn \c__eb_font_reset_family_seq - { \eb_font_double_engine_set:n {#1} } - -\cs_new_protected:Npn \eb_setmainfont:nn #1#2 - { \__fontspec_main_setmainfont:nn {#2} {#1} } -\cs_new_protected:Npn \eb_setsansfont:nn #1#2 - { \__fontspec_main_setsansfont:nn {#2} {#1} } -\cs_new_protected:Npn \eb_setmonofont:nn #1#2 - { \__fontspec_main_setmonofont:nn {#2} {#1} } -\cs_new_protected:Npn \eb_setCJKmainfont:nn #1#2 - { \eb_set_family:nnn { \CJKrmdefault } {#2} {#1} } -\cs_new_protected:Npn \eb_setCJKsansfont:nn #1#2 - { \eb_set_family:nnn { \CJKsfdefault } {#2} {#1} } -\cs_new_protected:Npn \eb_setCJKmonofont:nn #1#2 - { \eb_set_family:nnn { \CJKttdefault } {#2} {#1} } -\cs_new_protected:Npn \eb_set_zhfont_songti:nn #1#2 - { \eb_set_family:nnn { songti } {#2} {#1} } -\cs_new_protected:Npn \eb_set_zhfont_heiti:nn #1#2 - { \eb_set_family:nnn { heiti } {#2} {#1} } -\cs_new_protected:Npn \eb_set_zhfont_kaishu:nn #1#2 - { \eb_set_family:nnn { kaishu } {#2} {#1} } -\cs_new_protected:Npn \eb_set_zhfont_fangsong:nn #1#2 - { \eb_set_family:nnn { fangsong } {#2} {#1} } - -\tl_const:Nn \eb_option_zhfont_tl - { UprightFont = *,AutoFakeBold = 1.5,ItalicFont = * } -\cs_new_protected:Npx \eb_setCJKmainfont:n #1 - { \eb_setCJKmainfont:nn {#1} { \eb_option_zhfont_tl } } -\cs_new_protected:Npx \eb_setCJKsansfont:n #1 - { \eb_setCJKsansfont:nn {#1} { \eb_option_zhfont_tl } } -\cs_new_protected:Npx \eb_setCJKmonofont:n #1 - { \eb_setCJKmonofont:nn {#1} { \eb_option_zhfont_tl } } -\cs_new_protected:Npx \eb_set_zhfont_songti:n #1 - { \eb_set_zhfont_songti:nn {#1} { \eb_option_zhfont_tl } } -\cs_new_protected:Npx \eb_set_zhfont_heiti:n #1 - { \eb_set_zhfont_heiti:nn {#1} { \eb_option_zhfont_tl } } -\cs_new_protected:Npx \eb_set_zhfont_kaishu:n #1 - { \eb_set_zhfont_kaishu:nn {#1} { \eb_option_zhfont_tl } } -\cs_new_protected:Npx \eb_set_zhfont_fangsong:n #1 - { \eb_set_zhfont_fangsong:nn {#1} { \eb_option_zhfont_tl } } - -\bool_if:NT \l__eb_font_noto_bool - { - \eb_setmainfont:nn { NotoSerif } - { - Extension = .ttf, - UprightFont = *-Regular, - BoldFont = *-Bold, - ItalicFont = *-Italic - } - \eb_setsansfont:nn { NotoSans } - { - Extension = .ttf, - UprightFont = *-Regular, - BoldFont = *-Bold, - ItalicFont = *-Italic - } - \eb_setmonofont:nn { NotoSansMono } - { - Extension = .ttf, - UprightFont = *-Regular, - BoldFont = *-Bold - } - \eb_setCJKmainfont:nn { FZShuSong-Z01S } - { - UprightFont = *, - BoldFont = FZHei-B01S, - ItalicFont = FZKai-Z03S - } - \eb_setCJKsansfont:n { FZHei-B01S } - \eb_setCJKmonofont:n { FZFangSong-Z02S } - \eb_set_zhfont_songti:n { FZShuSong-Z01S } - \eb_set_zhfont_heiti:n { FZHei-B01S } - \eb_set_zhfont_kaishu:n { FZKai-Z03S } - \eb_set_zhfont_fangsong:n { FZFangSong-Z02S } - \cs_new_protected:Npn \songti { \eb_switch_family:n { songti } } - \cs_new_protected:Npn \heiti { \eb_switch_family:n { heiti } } - \cs_new_protected:Npn \kaishu { \eb_switch_family:n { kaishu } } - \cs_new_protected:Npn \fangsong { \eb_switch_family:n { fangsong } } - } - \includepdfset{fitpaper = true} \geometry { vmargin = 2.54cm, hmargin = 3.17cm, - columnsep = 2\ccwd, + columnsep = \ccwd, headheight = 2.04cm, headsep = 0.5cm, footskip = 0.79cm, @@ -1323,6 +1452,9 @@ \clist_new:N \g__eb_geometry_clist \eb_ctex_define:nn { geoset } { + headruleskip .tl_set:N = \headruleskip, + headruleskip .initial:n = 1.5pt, + footruleskip .tl_set:N = \footruleskip, unknown .code:n = { \clist_gput_right:Nx \g__eb_geometry_clist @@ -1342,13 +1474,13 @@ { \hbox:n { }\thispagestyle{#1}\clearpage } } } -\RenewDocumentCommand{\frontmatter}{sO{Roman}} +\DeclareDocumentCommand{\frontmatter}{sO{Roman}} { \IfBooleanTF{#1}{\clearpage}{\cleardoublepage} \boolfalse{@mainmatter} \pagenumbering{#2} } -\RenewDocumentCommand{\mainmatter}{s} +\DeclareDocumentCommand{\mainmatter}{s} { \IfBooleanTF{#1}{\clearpage}{\cleardoublepage} \booltrue{@mainmatter} @@ -1429,8 +1561,8 @@ headrule .initial:n = { \group_begin: - \color{ctex@frame}\vspace*{1.5pt} - \hrule width \textwidth height \l__eb_rule_width_dim + \color{ctex@frame} + \hrule\@width\textwidth\@height\eb@rule@width@dim \group_end: }, footrule .tl_gset:N = \footrule, @@ -1440,7 +1572,7 @@ { \group_begin: \color{ctex@frame} - \hrule width 0.35\columnwidth height \l__eb_rule_width_dim + \hrule\@width 0.35\columnwidth\@height\eb@rule@width@dim \vspace*{2.6pt} \group_end: }, @@ -1674,7 +1806,7 @@ figure/#1 = ##1, table/#1 = ##1, lstlisting/#1 = ##1 - } + } } } @@ -1686,6 +1818,12 @@ \hspace{\use:c { eb@toc@#1@numsep }} }{} } +\cs_if_exist:NF \chapter + { + \newcounter{chapter} + \bool_set_false:N \l__eb_class_book_bool + \ctex_define:n { chapter/tocline .code:n = { } } + } \newbool{eb@titletoc@hang@fix} \eb_ctex_define:nn { tocset } { @@ -1863,29 +2001,32 @@ } } } - -\eb_appto_cmd:Nn \@chapter +\cs_if_exist:NT \chapter { - \skip_if_eq:nnF { \l__eb_toc_lolskip_skip } { \c_zero_skip } + \eb_appto_cmd:Nn \@chapter { - \addtocontents{lol} - {\protect\addvspace{\skip_use:N \l__eb_toc_lolskip_skip}} + \skip_if_eq:nnF { \l__eb_toc_lolskip_skip } { \c_zero_skip } + { + \addtocontents{lol} + {\protect\addvspace{\skip_use:N \l__eb_toc_lolskip_skip}} + } + \bool_if:NF \l__eb_class_book_bool + { \msg_error:nn { easybase } { no-chapter } } + } + \eb_appto_cmd:Nn \@schapter + { + \bool_if:NF \l__eb_class_book_bool + { \msg_error:nn { easybase } { no-chapter } } } - \bool_if:NF \l__eb_class_book_bool - { \msg_error:nn { easybook } { no-chapter } } - } -\eb_appto_cmd:Nn \@schapter - { - \bool_if:NF \l__eb_class_book_bool - { \msg_error:nn { easybook } { no-chapter } } } -\msg_new:nnn { easybook } { no-chapter } +\msg_new:nnn { easybase } { no-chapter } { Your~document~class~is~in~article~mode. \\ The~\string\chapter\space~command~will~not~be~used. } -\tl_set:Nn \l__eb_toc_type_tl { book } +\tl_set:Nx \l__eb_toc_type_tl + { \bool_if:NTF \l__eb_class_book_bool { book } { article } } \tl_new:N \eb@bitoc@title \keys_define:nn { eb/listoc } { @@ -1894,7 +2035,9 @@ multoc .bool_set:N = \l__eb_multoc_bool, multoc .default:n = true, multoc .initial:n = false, - title .code:n = \eb_assign_toc_title:n {#1} + title .code:n = \eb_assign_toc_title:n {#1}, + columns .int_set:N = \l__eb_toc_columns_int, + columns .initial:n = 2 } \bool_if:NTF \l__eb_class_book_bool { \keys_define:nn { } { eb/listoc .inherit:n = ctex/chapter } } @@ -1978,32 +2121,19 @@ } \cs_new_protected:Npn \eb_multoc_pre_bool: { - \bool_if:NTF \l__eb_class_book_bool - { - \ifbool{@twocolumn} - { - \booltrue{@restonecol} - \bool_if:NF \l__eb_multoc_bool { \onecolumn } - }{ - \boolfalse{@restonecol} - \bool_if:NT \l__eb_multoc_bool { \twocolumn } - } - } - { \tl_set:Nn \l__eb_toc_type_tl { article } } + \bool_if:NT \l__eb_multoc_bool + { \begin{multicols}{\int_use:N \l__eb_toc_columns_int} } } \cs_new_protected:Npn \eb_multoc_post_bool: - { - \bool_if:NT \l__eb_class_book_bool - { \ifbool{@restonecol}{\twocolumn}{\onecolumn} } - } + { \bool_if:NT \l__eb_multoc_bool { \end{multicols} } } \RenewDocumentCommand{\tableofcontents}{t+oD(){}} { \group_begin: \tl_set_eq:NN \eb@toc@title \contentsname \tl_set:Nn \eb@bitoc@title { Contents } \IfValueT{#2}{\keys_set:nn { eb/listoc } {#2}} - \eb_multoc_pre_bool: \eb_title_mark_notoc:n { \eb@toc@title } + \eb_multoc_pre_bool: \vspace*{\dim_use:N \l__eb_toc_offset_dim} \@starttoc{toc}#3 \IfBooleanT{#1} @@ -2020,8 +2150,8 @@ \group_begin: \tl_set_eq:NN \eb@toc@title \listfigurename \IfValueT{#3}{\keys_set:nn { eb/listoc } {#3}} - \eb_multoc_pre_bool: \eb_title_number_intoc_bool:nn {#2} {#1} + \eb_multoc_pre_bool: \dim_add:NV \l__eb_toc_offset_dim \l__eb_toc_figure_offset_dim \vspace*{\dim_use:N \l__eb_toc_offset_dim} \@starttoc{lof} @@ -2033,8 +2163,8 @@ \group_begin: \tl_set_eq:NN \eb@toc@title \listtablename \IfValueT{#3}{\keys_set:nn { eb/listoc } {#3}} - \eb_multoc_pre_bool: \eb_title_number_intoc_bool:nn {#2} {#1} + \eb_multoc_pre_bool: \dim_add:NV \l__eb_toc_offset_dim \l__eb_toc_table_offset_dim \vspace*{\dim_use:N \l__eb_toc_offset_dim} \@starttoc{lot} @@ -2046,8 +2176,8 @@ \group_begin: \tl_set_eq:NN \eb@toc@title \lstlistlistingname \IfValueT{#3}{\keys_set:nn { eb/listoc } {#3}} - \eb_multoc_pre_bool: \eb_title_number_intoc_bool:nn {#2} {#1} + \eb_multoc_pre_bool: \dim_add:NV \l__eb_toc_offset_dim \l__eb_toc_lstlisting_offset_dim \vspace*{\dim_use:N \l__eb_toc_offset_dim} \@starttoc{lol} @@ -2189,7 +2319,7 @@ \c__eb_subfont_math_charter_tl { \eb_put_newtxmath:n { charter,noOT1 } } } - { \RequirePackage{newtxmath,bm} } + { \eb@package@load{newtxmath,bm} } } \fp_new:N \l__eb_spread_line_fp @@ -2438,6 +2568,7 @@ label = (\Alph*), column-sep = \ccwd, item-indent = 2\ccwd, + label-offset = 0.5\ccwd, label-width = 1.5\ccwd, after-item-skip = 0ex plus .1ex } @@ -2545,7 +2676,7 @@ boxsep = 0pt, arc = 0pt, fonttitle = \sffamily, - boxrule = \l__eb_rule_width_dim + boxrule = \eb@rule@width@dim } \newtcbox[auto~counter]{\eb@exercise@box}[1]{tc-exercise,#1} \NewDocumentEnvironment{outline}{O{}D(){\abstractname}o+b} @@ -2632,7 +2763,7 @@ { standard~jigsaw, nobeforeafter,tcbox~raise~base, - top = 1.25pt,bottom = 1.25pt,left = 1.25pt,right = 1.25pt, + top = 1.25qt,bottom = 1.25qt,left = 1.25qt,right = 1.25qt, boxrule = 0.75pt,arc = 1pt, colback = #1,opacityback = 0.12,colframe = #1,#3 }{#2} @@ -2697,9 +2828,11 @@ \group_begin: \tl_set_eq:NN \eb@toc@title \bibname \IfValueT{##3}{ \keys_set:nn { eb/listoc } {##3} } - \eb_multoc_pre_bool: \tl_set:Nn \bibsection - { \eb_title_number_intoc_bool:nn {##2} {##1} } + { + \eb_title_number_intoc_bool:nn {##2} {##1} + \eb_multoc_pre_bool: + } \exp_args:NV \bibliography \l__eb_bib_datafile_tl \eb_multoc_post_bool: \group_end: @@ -2735,12 +2868,12 @@ { \bool_if:NTF \l__eb_backend_bibtex_bool { - \RequirePackage[sort&compress]{natbib} + \eb@package@load[sort&compress]{natbib} \EbBibtexSet } { \EbBiblatexPreset - \RequirePackage{biblatex} + \eb@package@load{biblatex} \EbBiblatexPostset } } @@ -2799,7 +2932,7 @@ aboveskip = 1.5ex plus .2ex minus .1ex, belowskip = 0.55ex plus .2ex minus .1ex, keepspaces = true, - framerule = \l__eb_rule_width_dim, + framerule = \eb@rule@width@dim, columns = flexible, abovecaptionskip = -1ex, belowcaptionskip = 1.5ex @@ -2931,7 +3064,7 @@ } \ctex_at_end_preamble:n { - \RequirePackage{hyperref} + \eb@package@load{hyperref} \urlstyle{same} \eb_allow_urlbreak: \ctex_hypersetup:n { pdfstartview = FitH } @@ -2969,73 +3102,5 @@ \labelformat{section}{Section~#1} \labelformat{subsection}{Subsection~#1} } - -\ctex_set:n - { - secnumdepth = 3, - tocdepth = \bool_if:NTF \l__eb_class_book_bool { 1 } { 2 }, - part = - { - pagestyle = empty, - tocline = \EbNumberLine{#1}#2, - format = \color{ctex@frame}\sffamily\Huge, - aftername = - { - \bool_if:NTF \l__eb_title_newline_bool - { \par\nobreak } { \hspace{\ccwd} } - } - }, - chapter = - { - % pagestyle = fancy, - format = - { - \color{ctex@frame}\sffamily\LARGE - \bool_if:NF \l__eb_title_newline_bool { \centering } - }, - aftername = - { - \bool_if:NTF \l__eb_title_newline_bool - { \par\nobreak\vskip 1.5pc } { \hspace{\ccwd} } - }, - beforeskip = -1.5ex, - afterskip = 3ex, - lotskip = 0.8pc, - lofskip = 0.8pc - }, - section = - { - hang = true, - format = \color{ctex@frame}\sffamily\Large, - aftername = \hspace{0.5\ccwd}, - beforeskip = 1.5ex plus .2ex minus .1ex, - afterskip = 1.5ex plus .2ex minus .1ex - }, - subsection = - { - hang = true, - format = \color{ctex@frame}\sffamily\large, - aftername = \hspace{0.5\ccwd}, - beforeskip = 1.3ex plus .2ex minus .1ex, - afterskip = 1.3ex plus .2ex minus .1ex - }, - subsubsection = - { - hang = true, - format = \color{ctex@frame}\sffamily, - aftername = \hspace{0.5\ccwd}, - beforeskip = \parskip, - afterskip = \parskip - } - } - -\bool_if:NF \l__eb_title_newline_bool - { - \ctex_set:n - { - part/hang = true, - chapter/hang = true - } - } -%</class> +%</package> \endinput
\ No newline at end of file diff --git a/macros/latex/contrib/easybook/easybook.ins b/macros/latex/contrib/easybook/easybook.ins index af8f3f8134..b70169f22a 100644 --- a/macros/latex/contrib/easybook/easybook.ins +++ b/macros/latex/contrib/easybook/easybook.ins @@ -20,6 +20,10 @@ The latest version of this license is in https://creativecommons.org/licenses/by/4.0/legalcode \endpreamble -\generate{\file{\jobname.cls}{\from{\jobname.dtx}{class}}} +\generate + { + \file{easybook.cls}{\from{\jobname.dtx}{class}} + \file{easybase.sty}{\from{\jobname.dtx}{package}} + } \endbatchfile
\ No newline at end of file diff --git a/macros/latex/contrib/easybook/easybook.pdf b/macros/latex/contrib/easybook/easybook.pdf Binary files differindex 80221ec676..7d7ea10892 100644 --- a/macros/latex/contrib/easybook/easybook.pdf +++ b/macros/latex/contrib/easybook/easybook.pdf |