diff options
Diffstat (limited to 'macros/latex/contrib/crefthe')
-rw-r--r-- | macros/latex/contrib/crefthe/crefthe-doc.pdf | bin | 112174 -> 115616 bytes | |||
-rw-r--r-- | macros/latex/contrib/crefthe/crefthe-doc.tex | 21 | ||||
-rw-r--r-- | macros/latex/contrib/crefthe/crefthe.sty | 80 |
3 files changed, 75 insertions, 26 deletions
diff --git a/macros/latex/contrib/crefthe/crefthe-doc.pdf b/macros/latex/contrib/crefthe/crefthe-doc.pdf Binary files differindex 4e1a55b9d5..7f4f6ea5e0 100644 --- a/macros/latex/contrib/crefthe/crefthe-doc.pdf +++ b/macros/latex/contrib/crefthe/crefthe-doc.pdf diff --git a/macros/latex/contrib/crefthe/crefthe-doc.tex b/macros/latex/contrib/crefthe/crefthe-doc.tex index 04051d0f60..70cdc89d92 100644 --- a/macros/latex/contrib/crefthe/crefthe-doc.tex +++ b/macros/latex/contrib/crefthe/crefthe-doc.tex @@ -77,19 +77,23 @@ \newenvironment{demo}{% \LocallyStopLineNumbers% \begin{tcolorbox}[enhanced jigsaw,pad at break*=1mm,breakable, - left=4mm,right=4mm,top=0.5mm,bottom=0mm, + left=2.5mm,right=3mm,top=0.5mm,bottom=0mm, colback=gray!5!paper,boxrule=0pt,frame hidden, - borderline west={1.5mm}{0mm}{gray!55!paper},arc=.7mm]% + borderline west={1.2mm}{0mm}{gray!55!paper},arc=.7mm]% }{\end{tcolorbox}\ResumeLineNumbers} +\newcommand{\packageoption}[1]{\texttt{\textcolor{black!67!green}{#1}}} +\newcommand{\commandoption}[1]{\texttt{\textcolor{black!67!cyan}{#1}}} + + \newcommand{\crefthepackage}{\textsf{crefthe}} \begin{document} -\title{\crefthepackage{} - cross referencing with proper definite articles} +\title{\crefthepackage{}\\\smallskip\itshape Cross referencing with proper definite articles} \author{Jinwen XU} -\thanks{Corresponding to: \texttt{\crefthepackage{} 2022/02/20}} +\thanks{Corresponding to: \texttt{\crefthepackage{} 2022/02/27}} \date{February 2022, in Paris} \maketitle @@ -231,7 +235,7 @@ To place hyperlinks at the right place, \lstinline|\crefthename| touches the cor \crefthepackage{} loads \textsf{cleveref} automatically and pass all the options to it. All its commands, used without optional arguments, degenerate to those in \textsf{cleveref}. For example, \lstinline|\crefthe{...}| is the same as \lstinline|\cref{...}|, and \lstinline|\crefthename| is the same as \lstinline|\crefname| if the definite articles are not specified. That said, you can safely use the command \lstinline|\crefthe| everywhere in your document without causing extra trouble. -With the option \texttt{overwrite}, user commands in \textsf{cleveref} will be replaced by those offered here, thus you can simply write \lstinline|\cref| for \lstinline|\crefthe| -- and similarly with \lstinline|\Cref|, \lstinline|\crefname| and \lstinline|\Crefname|. +With the package option \packageoption{overwrite}, user commands in \textsf{cleveref} will be replaced by those offered here, thus you can simply write \lstinline|\cref| for \lstinline|\crefthe| -- and similarly with \lstinline|\Cref|, \lstinline|\crefname| and \lstinline|\Crefname|. \section{Known issues} @@ -241,5 +245,12 @@ With the option \texttt{overwrite}, user commands in \textsf{cleveref} will be r \item The names of theorem-like environments are not provided here, you need to define them by yourself. However, users are encouraged to use the \ProjLib{} toolkit (more specifically, the internal package \textsf{create-theorem}), which already handles everything for you. \end{itemize} +\medskip +If you run into any issues or have ideas for improvement, feel free to discuss on: +\begin{center} + \url{https://github.com/Jinwen-XU/crefthe/issues} +\end{center} +or email me via \href{mailto:ProjLib@outlook.com}{\texttt{ProjLib@outlook.com}}. + \end{document} diff --git a/macros/latex/contrib/crefthe/crefthe.sty b/macros/latex/contrib/crefthe/crefthe.sty index 7edf7e1788..213f3d2e60 100644 --- a/macros/latex/contrib/crefthe/crefthe.sty +++ b/macros/latex/contrib/crefthe/crefthe.sty @@ -13,7 +13,7 @@ \RequirePackage{l3keys2e} \ProvidesExplPackage {crefthe} - {2022/02/20} {} + {2022/02/27} {} {Cross referencing with proper definite articles} \keys_define:nn { crefthe } @@ -26,6 +26,7 @@ \ProcessKeysOptions { crefthe } \RequirePackage { cleveref } +\RequirePackage { regexpatch } \NewCommandCopy \crefthe_cref_original:w \cref \NewCommandCopy \crefthe_Cref_original:w \Cref @@ -41,20 +42,28 @@ \tl_new:N \l__crefthe_prep_once_tl \tl_new:N \l__crefthe_prep_each_tl -\bool_new:N \l__crefthe_uppercase_bool +\bool_new:N \g__crefthe_uppercase_bool +\bool_new:N \g__crefthe_has_prep_bool \NewDocumentCommand \crefthe { s t- t+ O{} m } { - \bool_set_false:N \l__crefthe_uppercase_bool + \bool_gset_false:N \g__crefthe_uppercase_bool \__crefthe_cref_general:NNNnnN #1 #2 #3 { #4 } { #5 } \crefthe_cref_original:w } \NewDocumentCommand \Crefthe { s t- t+ O{} m } { - \bool_set_true:N \l__crefthe_uppercase_bool + \bool_gset_true:N \g__crefthe_uppercase_bool \__crefthe_cref_general:NNNnnN #1 #2 #3 { #4 } { #5 } \crefthe_Cref_original:w } -\cs_new_protected:Npn \__crefthe_cref_general:NNNnnN #1 #2 #3 #4 #5 #6 +\cs_new_protected:Nn \__crefthe_cref_general:NNNnnN { + \tl_if_blank:eTF #4 + { + \bool_gset_false:N \g__crefthe_has_prep_bool + } + { + \bool_gset_true:N \g__crefthe_has_prep_bool + } \bool_if:NTF #2 { \tl_set:Nn \l__crefthe_prep_once_tl { #4 } } { @@ -78,7 +87,7 @@ } % \__crefthe_prep_mode: defines the default mode for supported languages -\cs_new:Npn \__crefthe_prep_mode: +\cs_new:Nn \__crefthe_prep_mode: { \str_case:Vn \languagename { @@ -94,51 +103,80 @@ { \__crefthe_name_general:nnnnnn { #1 } { #2 } { #3 } { #4 } { #5 } { c } } + \NewDocumentCommand \Crefthename { m O{} m O{} m } { \__crefthe_name_general:nnnnnn { #1 } { #2 } { #3 } { #4 } { #5 } { C } } -\cs_new_protected:Npn \__crefthe_name_general:nnnnnn #1 #2 #3 #4 #5 #6 + +\cs_new_protected:Nn \__crefthe_name_general:nnnnnn { % #6 is c or C \tl_if_blank:nTF { #2 } { - \cs:w crefthe_#6refname_original:w \cs_end: { #1 } { #3 } { #5 } - \cs_set:cn { #6ref_#1_format:nnn } { ##2 #3 ~ ##1 ##3 } - \cs_set:cn { #6ref_#1_format_first:nnn } { ##2 #5 ~ ##1 ##3 } + \__crefthe_name_general_do:nnnnnn { #1 } {} { #3 } {} { #5 } { #6 } } { - \cs:w crefthe_#6refname_original:w \cs_end: { #1 } { \crefthemark { #2 } #3 } { \crefthemark { #4 } #5 } - \cs_set:cn { #6ref_#1_format:nnn } { \crefthemark { #2 } ##2 #3 ~ ##1 ##3 } - \cs_set:cn { #6ref_#1_format_first:nnn } { \crefthemark { #4 } ##2 #5 ~ ##1 ##3 } + \__crefthe_name_general_do:nnnnnn { #1 } { \crefthemark { #2 } } { #3 } { \crefthemark { #4 } } { #5 } { #6 } } + } + +\cs_new_protected:Nn \__crefthe_name_general_do:nnnnnn + { + \use:c { crefthe_#6refname_original:w } { #1 } { #2 #3 } { #4 #5 } \hook_gput_code:nnn { begindocument } { crefthe } { - \cs_set_eq:cc { #6ref@ #1 @format } { #6ref_#1_format:nnn } - \cs_set_eq:cc { #6ref@ #1 @format@first } { #6ref_#1_format_first:nnn } + \crefthe_patch_format:nnnnn { 2 } { #6ref@#1@format } { #6ref@#1@name } { #2 } { #3 } + \crefthe_patch_format:nnnnn { 2 } { #6ref@#1@format@first } { #6ref@#1@name@plural } { #4 } { #5 } + \crefthe_patch_format:nnnnn { 3 } { #6refrange@#1@format } { #6ref@#1@name@plural } { #4 } { #5 } + \crefthe_patch_format:nnnnn { 3 } { #6refrange@#1@format@first } { #6ref@#1@name@plural } { #4 } { #5 } + } + } + +\seq_new:N \g__crefthe_already_patched_seq + +\cs_new_protected:Nn \crefthe_patch_format:nnnnn + % #1 = the # number for the beginning mark of hyperlink + % #2 = name of the format command + % #3 = name of the command after hyperlink mark + % #4 = new content before the mark + % #5 = new content after the mark + { + \seq_if_in:NnF \g__crefthe_already_patched_seq { #2 - #3 } + { + \makeatletter + \tl_set:Nn \l_tmpa_tl { #4 } + \tl_set:Nn \l_tmpb_tl { #5 } + \exp_args:Nc \regexpatchcmd { #2 } + { \cP. #1 \c{ #3 } } + { \u{l_tmpa_tl} \cP\# #1 \u{l_tmpb_tl} } + { } { \PatchFailed } + \makeatother + \seq_gput_right:Nn \g__crefthe_already_patched_seq { #2 - #3 } } } + \cs_generate_variant:Nn \text_lowercase:n { V } \NewDocumentCommand \crefthemark { m } { \crefthe_contraction:Ve \l__crefthe_prep_each_tl { \crefthe_contraction:Vn \l__crefthe_prep_once_tl { #1 } } \tl_gclear:N \l__crefthe_prep_once_tl - \tl_set:Nx \l__crefthe_prep_each_tl + \tl_gset:Nx \l__crefthe_prep_each_tl { \text_lowercase:V \l__crefthe_prep_each_tl } \str_if_eq:eeF { \str_tail:n { #1 } } { ' } { ~ } - \bool_set_false:N \l__crefthe_uppercase_bool + \bool_gset_false:N \g__crefthe_uppercase_bool } \prg_generate_conditional_variant:Nnn \str_case_e:nn { nv } { T, F, TF } -\cs_new:Npn \crefthe_contraction:nn #1#2 +\cs_new:Nn \crefthe_contraction:nn { \exp_args:Ne \__crefthe_contraction:nnn { \text_lowercase:n { #2 } } { #1 } { #2 } } \cs_generate_variant:Nn \crefthe_contraction:nn { V, Ve } -\cs_new:Npn \__crefthe_contraction:nnn #1 #2 #3 +\cs_new:Nn \__crefthe_contraction:nnn { % #1 is \text_lowercase:n { #3 } % #2 is the preposition @@ -157,9 +195,9 @@ { #2~#3 } } } -\cs_new:Npn \__crefthe_conditional_uppercase:n #1 +\cs_new:Nn \__crefthe_conditional_uppercase:n { - \bool_if:NTF \l__crefthe_uppercase_bool + \bool_if:NTF \g__crefthe_uppercase_bool { \text_titlecase_first:n } { \use:n } { #1 } |