diff options
-rw-r--r-- | Master/texmf-dist/doc/latex/titlecaps/README | 7 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/titlecaps/titlecaps.pdf | bin | 0 -> 271791 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/titlecaps/titlecaps.tex | 405 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/titlecaps/titlecaps.sty | 496 | ||||
-rwxr-xr-x | Master/tlpkg/bin/tlpkg-ctan-check | 2 | ||||
-rw-r--r-- | Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc | 1 | ||||
-rw-r--r-- | Master/tlpkg/tlpsrc/titlecaps.tlpsrc | 0 |
7 files changed, 910 insertions, 1 deletions
diff --git a/Master/texmf-dist/doc/latex/titlecaps/README b/Master/texmf-dist/doc/latex/titlecaps/README new file mode 100644 index 00000000000..05bd3a320ad --- /dev/null +++ b/Master/texmf-dist/doc/latex/titlecaps/README @@ -0,0 +1,7 @@ +The titlecaps package is intended for setting rich text into titling +capitals (in which the first character of words are capitalized). It +automatically accounts for diacritical marks (like umlauts), national +symbols (like "ae"), punctuation, and font changing commands that alter +the appearance or size of the text. It allows a list of predesignated +words to be protected as lower-cased, and also allows for titling +exceptions of various sorts. diff --git a/Master/texmf-dist/doc/latex/titlecaps/titlecaps.pdf b/Master/texmf-dist/doc/latex/titlecaps/titlecaps.pdf Binary files differnew file mode 100644 index 00000000000..4863cf7f3a2 --- /dev/null +++ b/Master/texmf-dist/doc/latex/titlecaps/titlecaps.pdf diff --git a/Master/texmf-dist/doc/latex/titlecaps/titlecaps.tex b/Master/texmf-dist/doc/latex/titlecaps/titlecaps.tex new file mode 100644 index 00000000000..c5492298c93 --- /dev/null +++ b/Master/texmf-dist/doc/latex/titlecaps/titlecaps.tex @@ -0,0 +1,405 @@ +\documentclass{article} +\def\version{1.0} +%% Copyright 2013 Steven B. Segletes +% +% 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 this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Steven B. Segletes. +% +\usepackage{titlecaps} +\usepackage{needspace} +\parskip 1em +\parindent 0em +\newcommand\rl{\rule{1em}{0in}} +\def\tcp{\textsf{titlecaps}} +\def\QL{\titlecap{quirks, tricks and limitations}} +\usepackage{verbatimbox} +\let\vb\verb +\def\bs{$\backslash$} +\reversemarginpar +\marginparwidth 1.6in +\newcommand\margtt[1]{\marginpar{\hfill\ttfamily#1}} +\newcommand\margcmd[1]{\marginpar{\hfill\ttfamily\char'134#1}} +\begin{document} +\begin{center} +\LARGE The {\tcp} Package\\ +\rule{0em}{.7em}\small Routines for setting rich-text input into +Titling Caps\\ +\rule{0em}{2.7em}\large Steven B. Segletes\\ +steven.b.segletes.civ@mail.mil\\ +\rule{0em}{1.7em}\today\\ +v\version +\end{center} + +\Addlcwords{for a is but and with of in as the etc on to if} +\section{\titlecap{description and commands}} + +The {\tcp} package is intended to be used to convert lower-cased text +into titling caps, wherein the first letter of every word is +capitalized, except for words designated to remain in lower case, for +example prepositions and conjunctions. While this function has been +performed elsewhere, for example in the \textsf{stringstrings} package, +it is here significantly enhanced. The \textsf{stringstrings} +implementation of titling caps is particularly limited because of its +slow speed (I criticize \textsf{stringstrings} because I wrote it). +Furthermore, that implementation only works on textual expressions, +which do not contain any font-modification commands. + +In contrast, the {\tcp} package is set up to work in conjunction with +font-modification commands that change the family, series, or shape of +the font. Likewise, it will work with the fontsize changing commands +(\vb|\tiny|, \vb|\scriptsize|\ldots\SoftSpace\vb|\Huge|) embedded in the +argument. It is also, unlike the \textsf{stringstrings} version, able +to screen out most punctuation when deciding whether a word is +predesignated as lower case. Furthermore, it looks for symbols that +might signify the beginning of a new text ``group'', such as (, [, \{, +`, and -, and thereafter titles the word that follows, even though the +first alphabetic letter is not technically at the lead of the ``word.'' + +The primary commands that have been implemented in this package are the +following:\\ +\itshape +\rl\vb|\titlecap[|option\vb|]{|rich text\vb|}|\\ +\rl\vb|\Addlcwords{|designated lower-case space-separated word list\vb|}|\\ +\rl\vb|\Resetlcwords|\\ +\upshape +In addition, the following auxiliary commands are also available:\\ +\itshape +\rl\vb|\textnc{|text\verb|}|\\ +\rl\vb|\def\converttilde{|\textup{T} or \textup{F}\vb|}|\\ +\rl\vb|\noatinsidetc|\\ +\rl\vb|\usestringstringsnames| +% (addlcwords,resetlcwords,addlcword,capitalizetitle,getargs) +\upshape + +~\\ +The \vb|\titlecap| command\margcmd{titlecap} is the primary contribution +of this package. It will (within constraints) capitalize the first +letter of each word in the argument. The primary constraint under which +it operates is the existence of a predefined lower-cased word list that +is set by the user, using the \verb|\Addlcwords| +command\margcmd{Addlcwords}. These predefined lower-cased words are +passed as an argument to \verb|\Addlcwords| in a space-separated list. +Subsequent invocations add to the existing list of predefined +lower-cased words. The user may clear the list of predefined +lower-cased words through the issuance of the \verb|\Resetlcwords| +command\margcmd{Resetlcwords}. + +When \verb|\titlecap| is invoked, it first breaks the argument into +individual pieces that constitute ``words.'' Note, however, that these +``words'' may include punctuation and text formatting commands +interspersed with the actual text. This is an essential challenge to +overcome. + +After breaking the argument into words, \verb|\titlecap| will attempt to +match each word of the argument to the list of predesignated lower-cased +words. In order to assist this process, the command (temporarily) +screens out text-formatting commands and punctuation marks from the +argument, so that their presence does not inhibit a word match with the +lower-cased word list (see {\QL} for exceptions). It +flags matches, so that these matching words will not later be titled. + +The command will then reconstitute the ``words'' of the argument with +their punctuation and font-changing commands intact. In the default +invocation, \verb|\titlecap| will capitalize the first word of the +argument, even if that word is on the lower-cased word list. This +default may be overridden with the command's optional argument. +Employing anything other than a capital ``P'' will treat the first word +of the argument like any other word, meaning it will be title-capped +only if it does not appear on the predesignated lower-cased word list. + +The algorithm that searches the ``words'' of the argument character by +character, in order to titlecap the first letter of a word, is, generally +speaking, able to process only textual content. However, special +provisions have been enacted to handle the following text-formatting +commands within the argument of \verb|\titlecap|: + +\begin{minipage}{\textwidth} +\rl +\begin{tabular}{llll} +\verb|\textup| & \verb|\upshape| & \verb|\tiny| & \verb|\Huge|\\ +\verb|\textit| & \verb|\itshape| & \verb|\scriptsize| & + \verb|\textnc|\footnote{This command is introduced by this package.}\\ +\verb|\textsc| & \verb|\scshape| & \verb|\footnotesize|&\\ +\verb|\textsl| & \verb|\slshape| & \verb|\small|&\\ +\verb|\textmd| & \verb|\mdseries| & \verb|\normalsize|&\\ +\verb|\textbf| & \verb|\bfseries| & \verb|\large|&\\ +\verb|\textrm| & \verb|\rmfamily| & \verb|\Large|&\\ +\verb|\textsf| & \verb|\sffamily| & \verb|\LARGE|&\\ +\verb|\texttt| & \verb|\ttfamily| & \verb|\huge|&\\ +\end{tabular} +\end{minipage} + +Other macros can generally be handled in the argument to +\verb|\titlecap| only if they expand to textual content. + +\needspace{3\baselineskip} +Once the first word of the argument has been titled ``by force'' (or +not, with the use of the optional arguement), the command proceeds +through each word, deciding whether or not to title the word, based on +the lower-cased word flag that has previously been set. The {\tcp} +package can notably handle the titling of strings containing both +diacritical marks found in various languages (such as \`o, \'o, \^o, +\"o, \~o, \=o, \.o, \u o, \v o, \H o, \t{oo}, \c o, \d o, and \b o), as +well as national symbols (such as \oe, \ae, and \o~[see {\QL}]). + +While punctuation had been earlier screened out in order to search for +predefined lower-cased words, that is a slightly different problem from +that of figuring out how to titlecap a punctuated word not on the +lower-cased list. While many punctuation marks trail a word and are, +therefore, not a problem, several punctuation marks lead a word, or +indicate a group separator, even in the absence of whitespace. +\verb|\titlecap| must make sure that these sorts of punctuation marks do +not inhibit the capitalization of the subsequent letter. To this end, +\verb|\titlecap| looks for instances of the following five characters: +-, (, [, \{, and `, and flags the next character for possible +capitalization (unless the word had been previously identified as +predefined lower-cased [see {\QL}]). + +\section{\QL} + +While {\tcp} has been set up to run with certain embedded size and +font-changing commands, it will not, in general, work with macros in the +argument, unless the macros expand directly to a text string. + +The {\tcp} package is designed to work with diacritical marks (for +example, umlauts) as well as national symbols (symbols like \ae, \oe, +\textit{etc.}). There remain, however, two national symbols which are +not handled properly by this package. They are {\aa} and {\l}. They +will not be capitalized, even if found at the beginning of a word. + +The {\tcp} package is designed to screen out punctuation when searching +for words that are pre-designated as lower-cased. So, for example, the +word (\textit{if}) or \textit{``if''} or [\textit{if} or \textit{if,} +will all be found to match \textit{if} when it is predesignated as lower +cased. However, {\tcp} cannot screen out the curly braces \verb|\{| and +\verb|\}| from the punctuation list. Thus, \{if\} will be capitalized +as \{If\} by \tcp. A workaround is detailed in each of the next two +paragraphs. + +To prevent a word from being titled (to force it into lower case), it +can be immediately preceded by a \verb|\relax|. In this way, the +\verb|\relax| is titled, rather than the following word. This method +can be used to for one-time exceptions to titling, or to overcome the +curly-brace problem described above, as in \verb|\{\relax if\}|. + +The package introduces a command, \verb|\textnc|\margcmd{textnc} +(standing for ``text no-change''), which forces its argument to be +independently considered as text, regardless of any surrounding +punctuation or other characters. Thus, this approach may also be used +to address the curly-brace issue as \verb|\{\textnc{it}\}|. In this +case, ``if'' would be titled if it is not on the lower-cased word list, +but left in lower case if it were on the lower-cased word list. The +\verb|\textnc| command is useful in a number of ways inside the argument +to \verb|\titlecap|, but always to signify its argument is to be treated +as a block of text, independently evaluated for its predesignated +lower-cased content. + +If a separator like, let's say, a left paren, is used without +whitespace, in the fashion of ``\verb|a(b)|,'' then neither \verb|a| nor +\verb|b| could possibly be detected as lower-cased words, since +the ``word'' without punctuation would be \verb|ab|, which is neither +\verb|a| nor is it \verb|b|. For individual instances or exceptions, +the insertion of a \verb|\relax| prior to ``\verb|a|'' or ``\verb|b|'' +would prevent titling of these terms. Alternately, the word +``\verb|ab|'' could be added to the predesignated lower-cased words +list, in which case, ``\verb|a(b)|'' would be preserved in lower case. +A third (and perhaps preferred) method is the use of the +\verb|\textnc{}| construct, which is introduced solely for the purpose +of designating embedded text as a separate word grouping. Thus, +\verb|\textnc{a}(\textnc{b})| as an argument to \verb|\titlecap| would +guarantee that both ``\verb|a|'' and ``\verb|b|'' would be independently +examined for their presence in the lower-cased word list, irrespective +of any surrounding punctuation. In this paragraph, the letters +``\verb|a|'' and ``\verb|b|'' have been used for simplicity, but could +actually represent words or groups of words. + +By \LaTeX{} convention, the construct ``\vb|very \large big|'' will +associate the \vb|\large| as the first letter of \vb|big|, rather than +as the last letter of \vb|very|. Unfortunately, leaving it that way +will screw up the titling of \vb|big|. Thus, when adapting the use of +fontsize changes to the {\tcp} package, the prior space is unskipped, +and a space is added after the fontsize change invocation, so that the +fontsize change command is at the end of the prior word, rather than at +the beginning of the next word. The one adverse side effect to this +approach is that a space \textbf{will} appear after a fontsize command, +even if one is not desired (for example, changing font size just prior +to punctuation). One can either issue a \vb|\unskip| following the +fontsize change to back-gobble the newly introduced space, or else place +the fontsize change following the punctuation. + +While \vb|\uppercase| will not work within the argument of a +\vb|\titlecap|, it was found that enclosing part of the argument in +double braces \margtt{\char'173\char'173~\char'175\char'175}will produce +upper case for that double-enclosed text. Thus,\\ +\rl\vb|\titlecap{This is a {{v\"ery}} big test}|\\ +will produce \titlecap{This is a {{v\"ery}} big test}. + +The implementation to make the fontsize change commands work within the +arguments of \vb|\titlecap| required the use of \vb|\makeatletter| +within \vb|\titlecap| itself (which is revoked with a +\vb|\makeatother| upon exit from \vb|\titlecap|). If that is not +considered a ``good practice'' for your situation, then you can disable +this feature with the command \vb|\noatintc|\margcmd{noatintc}. +However, it is likely, at that point, that the fontsize changing +commands as arguments will break the \vb|\titlecap| command. + +Except in the case of the various \vb|\text|\textit{xx}\vb|{}| commands, +for which special provision has been made, and for the double-brace +quirk mentioned above, the argument of \vb|\titlecap| should not contain +braces used as group delimiters, for example, in the fashion of:\\ +\rl\vb|\titlecap{this is a {\itshape test of|\\ +\rl\rl\vb|the} emergency broadcast system}|\\ It may not break the code, +but will likely not produce a desired result. If groupings must be +placed in the argument, using \verb|\textnc{}| to condition the argument +is recommended. Thus,\\ +\rl\vb|\titlecap{this is a \textnc{\itshape test of|\\ +\rl\rl\vb|the} emergency broadcast system}|\\ +will result in ``% +\titlecap{this is a \textnc{\itshape test of the} emergency +broadcast system}'' (of course, in this case, a \vb|\textit{}| would +have worked directly, without a problem). + +There should be no direct use or need to nest \vb|\titlecap| commands. +However, if it is absolutely necessary, the embedded invocation of +\verb|\titlecap| should be expressed as\\ +\rl\verb|\titlecap{...\titlecap\textnc{...}...}|. + +\section{\titlecap{auxiliary commands}} + +In addition to the primary commands offered by this package, there are +several auxiliary commands. + +As described in the section {\QL}, the \verb|\textnc|\margcmd{textnc} +command was introduced when additional grouping must occur inside the +argument of a \verb|\titlecap| command. The argument of \verb|\textnc| +will itself make no changes to its argument, but will force +\verb|\titlecap| to independtly evaluate the \verb|\textnc| argument for +its lower-cased content, regardless of any surrounding punctuation or +text. The command may only be \textit{needed} within an argument to +\verb|\titlecap|. However, if your application requires its invocation +outside of a \verb|\titlecap| argument, it will merely output the +argument without any modification. + +By default, the {\tcp} package treats hardspaces ($\sim$) as characters and +not white space. This default treatment can be changed by setting the +following parameter: \verb|\def\converttilde{T}|\margcmd{converttilde}. +Following that invocation, hardspaces in the argument of +\verb|\titlecap| should be indistinguishable from white space. + +The command \verb|\noatinsidetc|\margcmd{noatinsidetc} was briefly +described in {\QL}. Its invocation will prevent the \verb|\titlecap| +command from employing the \verb|\makeatletter| command, if this is +considered bad practice for your setting. However, its invocation will +likely make the {\tcp} package unable to process fontsize command +changes. + +The last of these auxiliary commands is +\verb|\usestringstringsnames|\margcmd{usestringstringsnames}. This +command will redefine certain command names previously defined by the +\textsf{stringstrings} package to instead use the corresponding commands +of the {\tcp} package, in essence redirecting the \textsf{stringstrings} +invocation to the current package. The redirected commands include the +following (note: see the \textsf{stringstrings} package documentation +for command arguments and options):\\ +\rl\verb|\addlcwords|\\ +\rl\verb|\resetlcwords|\\ +\rl\verb|\addlcword|\\ +\rl\verb|\getargs|\\ +\rl\verb|\capitalizetitle|\\ +If this command is invoked without the prior loading of the +\textsf{stringstrings} package, these commands will still be enabled for +subsequent use. Because the {\tcp} package produces output which can +include font changes and other material that cannot be placed into an +\verb|\edef|, the output of the quiet version of the newly redirected +\verb|\capitalizetitle[q]| produces a \verb|\def\thestring{}| rather +than an \verb|\edef\thestring{}|. + +\section{Acknowledgements} + +I would like to acknowledge the assistance of David Carlisle who, +through the \textsf{tex.stackexchange} website, assisted with both the +string parsing and punctuation screening techniques of this package: + +\verb|http://tex.stackexchange.com/questions/101604/parsing-strings|\\ +\verb|-containing-diacritical-marks-macros| + +\verb|http://tex.stackexchange.com/questions/105735/ignoring|\\ +\verb|-punctuation-during-comparison| + +\clearpage +\section{\titlecap{a \ttfamily\bs titlecap \rmfamily demonstration +for beginners,\\ expressed in \texttt{\bs titlecap}}} + +\Resetlcwords +\Addlcwords{for a is but and with of in as the etc on to if} +%\noatinsidetc +\titlecap{% +%{ +to know that none of the words typed in this paragraph were initially +upper cased might be of interest to you. it is done to demonstrate the +behavioral features of this package. first, you should know the words +that i have pre-designated as lower case. they are: ``for a is but and +with of in as the etc on to if.'' you can define your own list. note +that punctuation, like the period following the word ``if'' did not mess +up the search for lower case (nor did the quotation marks just now). +punctuation which is screened out of the lower-cased word search pattern +include . , : ; ( ) [ ] ? ! ` ' however, I cannot screen text braces; +\{for example in\} is titled, versus (for example in), since the braces +are not screened out in the search for pre-designated lower-case words +like for and in. However, \texttt{\bs textnc} provides a workaround: +\{\textnc{for example in}\}. titlecap will consider capitalizing +following a (, [, \{, or - symbol, such as (abc-def). you can use your +text\textit{\relax xx} commands, like i just did here with the prior xx, +but if you want the argument of that command to not be titled, you +either need, in this example, to add \textit{xx} to the lowercase word +list, which you can see i did not. instead, i put ``\bs relax~xx'' as +the argument, so that, in essence, the \bs relax was capitalized, not +the x. Or you could use \texttt{\bs textnc} . here i demonstrate that +text boldface, \textbf{as in the \bs textbf command}, also works fine, +as do \texttt{texttt}, \textsl{textsl}, \textsc{textsc}, +\textsf{textsf}, \textit{etc}. titlecap will work on diacritical marks, +such as \"apfel, \c cacao \textit{etc.}, \scriptsize fontsize \LARGE +changing commands\normalsize\unskip, as well as national symbols such as +\o laf, \ae gis, and \oe dipus. unfortunately, i could not get it to +work on the \aa~nor the \l~symbols. the method will work with some +things in math mode, capitalizing symbols if there is a leading space, +$x^2$ can become $ x^2$, and it can process but it will not capitalize +the greek symbols, such as $\alpha$, and will choke on most macros, if +they are not direct character expansions. Additionally, +\textsf{titlecaps} also works with font changing declarations, for +example, \bs itshape\bs sffamily. \itshape\sffamily you can see that it +works fine. likewise, any subsequent \bs textxx command will, upon +completion, return the font to its prior state, such as this +\textbf{textbf of some text}. you can see that i have returned to the +prior font, which was italic sans-serif. now I will return to upright +roman\upshape\rmfamily. a condition that will not behave well is inner +braces, such as \ttfamily \bs titlecap\{blah \{inner brace material\} +blah-blah\}. \rmfamily see the section on quirks and limitations for a +workaround involving \texttt{\bs textnc}. titlecap will always +capitalize the first word of the argument (\textbf{even if it is on the +lower-case word list}), unless \texttt{\bs titlecap} is invoked with an +optional argument that is anything other than a capital p. in that case, +the first word will be titled \textit{unless} it is on the lowercase +word list. for example, i will do a \bs titlecap[\relax s]\{\relax +a~big~man\} and get ``\titlecap[s]\textnc{a big man}'' with the ``a'' +not titled. i hope this package is useful to you, but as far as using +\textsf{titlecaps} on such large paragraphs\ldots \textbf{do not try +this at home!}} + +\section{Code Listing} + +\verbatiminput{titlecaps.sty} + +\end{document} + + + diff --git a/Master/texmf-dist/tex/latex/titlecaps/titlecaps.sty b/Master/texmf-dist/tex/latex/titlecaps/titlecaps.sty new file mode 100644 index 00000000000..850ad083231 --- /dev/null +++ b/Master/texmf-dist/tex/latex/titlecaps/titlecaps.sty @@ -0,0 +1,496 @@ +\ProvidesPackage{titlecaps} +[2013/04/11 V1.0 + Routines for setting rich-text input into Titling Caps] +%% Copyright 2013 Steven B. Segletes +% +% 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 this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Steven B. Segletes. +% +\usepackage{ifnextok} +\usepackage{ifthen} +\newcounter{lcword@index} +\newcounter{word@count} +\newcounter{lc@words} +\let\SaveHardspace~ +\def\SoftSpace{ } +\catcode`\^^00=12 +\def\cmd@flag{^^00} % FLAGS END-OF-COMMAND; NEXT CHAR CAPPED + +\let\sv@textup\textup +\let\sv@textit\textit +\let\sv@textsc\textsc +\let\sv@textsl\textsl +\let\sv@textmd\textmd +\let\sv@textbf\textbf +\let\sv@textrm\textrm +\let\sv@textsf\textsf +\let\sv@texttt\texttt +\let\sv@itshape\itshape +\let\sv@upshape\upshape +\let\sv@scshape\scshape +\let\sv@slshape\slshape +\let\sv@bfseries\bfseries +\let\sv@mdseries\mdseries +\let\sv@sffamily\sffamily +\let\sv@rmfamily\rmfamily +\let\sv@ttfamily\ttfamily + +% THESE ARE THE PUNCTUATION MARKS SCREENED OUT FOR +% LOWER CASE WORD SEARCH +\newcommand\kill@punct{% +\catcode`.=9% +\catcode`,=9% +\catcode`:=9% +\catcode`;=9% +\catcode`(=9% +\catcode`)=9% +\catcode`[=9% +\catcode`]=9% +\catcode`?=9% +\catcode`!=9% +\catcode``=9% +\catcode`'=9% +} + +\newcommand\restore@punct{% +\catcode`.=12% +\catcode`,=12% +\catcode`:=12% +\catcode`;=12% +\catcode`(=12% +\catcode`)=12% +\catcode`[=12% +\catcode`]=12% +\catcode`?=12% +\catcode`!=12% +\catcode``=12% +\catcode`'=12% +} + +\def\add@space{\protected@edef\@thestring{\@thestring\SoftSpace}} + +% PRIMUS IS FOR BEGINNING-OF-STRING TITLE-CAPPING (1st WORD OVERRIDES +% PREDEFINED LOWER CASE) +\newcommand\redefine@primus{% + \def\textup##1{\relax\bgroup\sv@upshape\titlecap[s]{{\cmd@flag##1}}\egroup}% + \def\textit##1{\relax\bgroup\sv@itshape\titlecap[s]{{\cmd@flag##1}}\egroup}% + \def\textsc##1{\relax\bgroup\sv@scshape\titlecap[s]{{\cmd@flag##1}}\egroup}% + \def\textsl##1{\relax\bgroup\sv@slshape\titlecap[s]{{\cmd@flag##1}}\egroup}% + \def\textmd##1{\relax\bgroup\sv@mdseries\titlecap[s]{{\cmd@flag##1}}\egroup}% + \def\textbf##1{\relax\bgroup\sv@bfseries\titlecap[s]{{\cmd@flag##1}}\egroup}% + \def\textrm##1{\relax\bgroup\sv@rmfamily\titlecap[s]{{\cmd@flag##1}}\egroup}% + \def\textsf##1{\relax\bgroup\sv@sffamily\titlecap[s]{{\cmd@flag##1}}\egroup}% + \def\texttt##1{\relax\bgroup\sv@ttfamily\titlecap[s]{{\cmd@flag##1}}\egroup}% + \def\textnc##1{\relax\bgroup\titlecap[s]{{\cmd@flag##1}}\egroup}% + \def\itshape{\relax\sv@itshape\cmd@flag}% + \def\upshape{\relax\sv@upshape\cmd@flag}% + \def\scshape{\relax\sv@scshape\cmd@flag}% + \def\slshape{\relax\sv@slshape\cmd@flag}% + \def\bfseries{\relax\sv@bfseries\cmd@flag}% + \def\mdseries{\relax\sv@mdseries\cmd@flag}% + \def\sffamily{\relax\sv@sffamily\cmd@flag}% + \def\rmfamily{\relax\sv@rmfamily\cmd@flag}% + \def\ttfamily{\relax\sv@ttfamily\cmd@flag}% +} +% SECONDUS IS FOR MIDSTRING TITLE-CAPPING (WHERE PREDEFINED LOWER +% CASE CAN PREVAIL) +\newcommand\redefine@secundus{% + \def\textup##1{\relax\bgroup\sv@upshape\titlecap[s]{{##1}}\egroup}% + \def\textit##1{\relax\bgroup\sv@itshape\titlecap[s]{{##1}}\egroup}% + \def\textsc##1{\relax\bgroup\sv@scshape\titlecap[s]{{##1}}\egroup}% + \def\textsl##1{\relax\bgroup\sv@slshape\titlecap[s]{{##1}}\egroup}% + \def\textmd##1{\relax\bgroup\sv@mdseries\titlecap[s]{{##1}}\egroup}% + \def\textbf##1{\relax\bgroup\sv@bfseries\titlecap[s]{{##1}}\egroup}% + \def\textrm##1{\relax\bgroup\sv@rmfamily\titlecap[s]{{##1}}\egroup}% + \def\textsf##1{\relax\bgroup\sv@sffamily\titlecap[s]{{##1}}\egroup}% + \def\texttt##1{\relax\bgroup\sv@ttfamily\titlecap[s]{{##1}}\egroup}% + \def\textnc##1{\relax\bgroup\titlecap[s]{{##1}}\egroup}% + \def\itshape{\relax\sv@itshape\cmd@flag}% + \def\upshape{\relax\sv@upshape\cmd@flag}% + \def\scshape{\relax\sv@scshape\cmd@flag}% + \def\slshape{\relax\sv@slshape\cmd@flag}% + \def\bfseries{\relax\sv@bfseries\cmd@flag}% + \def\mdseries{\relax\sv@mdseries\cmd@flag}% + \def\sffamily{\relax\sv@sffamily\cmd@flag}% + \def\rmfamily{\relax\sv@rmfamily\cmd@flag}% + \def\ttfamily{\relax\sv@ttfamily\cmd@flag}% +} + +% TERTIUS IS USED FOR STRIPPING OUT MACROS, SO THAT LOWER-CASE +% WORDS CAN BE FOUND +\newcommand\redefine@tertius{% + \def\textup##1{\bgroup{##1}\egroup}% + \def\textit##1{\bgroup{##1}\egroup}% + \def\textsc##1{\bgroup{##1}\egroup}% + \def\textsl##1{\bgroup{##1}\egroup}% + \def\textmd##1{\bgroup{##1}\egroup}% + \def\textbf##1{\bgroup{##1}\egroup}% + \def\textrm##1{\bgroup{##1}\egroup}% + \def\textsf##1{\bgroup{##1}\egroup}% + \def\texttt##1{\bgroup{##1}\egroup}% + \def\textnc##1{\bgroup{##1}\egroup}% + \def\itshape{}% + \def\itshape{}% + \def\upshape{}% + \def\scshape{}% + \def\slshape{}% + \def\bfseries{}% + \def\mdseries{}% + \def\sffamily{}% + \def\rmfamily{}% + \def\ttfamily{}% +} + +\newcommand\un@define{% + \let\textup\sv@textup% + \let\textit\sv@textit% + \let\textsc\sv@textsc% + \let\textsl\sv@textsl% + \let\textmd\sv@textmd% + \let\textbf\sv@textbf% + \let\textrm\sv@textrm% + \let\textsf\sv@textsf% + \let\texttt\sv@texttt% + \def\textnc##1{##1}% + \let\itshape\sv@itshape% + \let\upshape\sv@upshape% + \let\scshape\sv@scshape% + \let\slshape\sv@slshape% + \let\bfseries\sv@bfseries% + \let\mdseries\sv@mdseries% + \let\sffamily\sv@sffamily% + \let\rmfamily\sv@rmfamily% + \let\ttfamily\sv@ttfamily% +} + +% USES EQUIVALENT NAMES FROM stringstrings PACKAGE +\newcommand\usestringstringsnames{% + \let\addlcwords\Addlcwords% + \let\resetlcwords\Resetlcwords% + \let\addlcword\add@lcword% + \let\getargs\get@argsC% + \newcommand\capitalizetitle[2][v]{% + \if v##1\titlecap[P]{##2}\else\titlecap@q[P]{##2}\fi% + }% +} + +% STORE (DON'T EXECUTE) \titlecap COMMAND & ARGUMENT +\newcommand\titlecap@q[2][P]{% + \def\thestring{\titlecap[#1]{#2}}% +}% + +% RESET PREDESIGNATED LOWERCASE WORD LIST +\setcounter{lc@words}{0} +\newcommand\Resetlcwords[0]{\setcounter{lc@words}{0}} + +% ADD WORDS TO PREDESIGNATED LOWERCASE WORD LIST +\newcommand\Addlcwords[1]{% + \get@argsC{#1}% + \setcounter{lcword@index}{0}% + \whiledo{\value{lcword@index} < \narg}{% + \addtocounter{lcword@index}{1}% + \add@lcword{\csname arg\roman{lcword@index}\endcsname}% + } +} +\newcommand\add@lcword[1]{% + \addtocounter{lc@words}{1}% + \expandafter\edef\csname lcword\roman{lc@words}\endcsname{#1} +} + +% SEARCH TERTIUS CONVERTED ARGUMENT FOR LOWERCASE WORDS, SET FLAG +% FOR EACH WORD (T = FOUND IN LIST, F= NOT FOUND IN LIST) +\newcommand\seek@lcwords[1]{% +\kill@punct% + \setcounter{word@count}{0}% + \whiledo{\value{word@count} < \narg}{% + \addtocounter{word@count}{1}% +\protected@edef\current@word{\csname arg\roman{word@count}\endcsname}% + \def\found@word{F}% + \setcounter{lcword@index}{0}% + \expandafter\def\csname% + found@word\roman{word@count}\endcsname{F}% + \whiledo{\value{lcword@index} < \value{lc@words}}{% + \addtocounter{lcword@index}{1}% + \protected@edef\current@lcword{% + \csname lcword\roman{lcword@index}\endcsname}% +%% THE FOLLOWING THREE LINES ARE FROM DAVID CARLISLE + \protected@edef\tmp{\noexpand\scantokens{\def\noexpand\tmp% + {\noexpand\ifthenelse{\noexpand\equal{\current@word}{\current@lcword}}}}}% + \tmp\ifhmode\unskip\fi\tmp +%% + {\expandafter\def\csname% + found@word\roman{word@count}\endcsname{T}% + \setcounter{lcword@index}{\value{lc@words}}}% + {}% + }% + }% +\if P#1\def\found@wordi{F}\fi% +\restore@punct% +} + +% THE TITLECAP ROUTINE +\newcommand\titlecap[2][P]{% + \digest@sizes% + \if T\converttilde\def~{ }\fi% + \redefine@tertius% + \get@argsC{#2}% + \seek@lcwords{#1}% + \if P#1% + \redefine@primus% + \get@argsC{#2}% + \protected@edef\primus@argi{\argi}% + \else% + \fi% + \setcounter{word@count}{0}% + \redefine@secundus% + \def\@thestring{}% + \get@argsC{#2}% + \if P#1\protected@edef\argi{\primus@argi}\fi% + \whiledo{\value{word@count} < \narg}{% + \addtocounter{word@count}{1}% + \if F\csname found@word\roman{word@count}\endcsname% + \title@word{\csname arg\roman{word@count}\endcsname}% + \expandafter\protected@edef\csname% + arg\roman{word@count}\endcsname{\@thestring}% + \else + \notitle@word{\csname arg\roman{word@count}\endcsname}% + \expandafter\protected@edef\csname% + arg\roman{word@count}\endcsname{\@thestring}% + \fi% + }% + \def\@thestring{}% + \setcounter{word@count}{0}% + \whiledo{\value{word@count} < \narg}{% + \addtocounter{word@count}{1}% + \ifthenelse{\value{word@count} = 1}% + {}{\add@space}% + \protected@edef\@thestring{\@thestring% + \csname arg\roman{word@count}\endcsname}% + }% + \let~\SaveHardspace% + \@thestring% + \restore@sizes% +\un@define} + +\newcommand\notitle@word[1]{% + \def\symbol@flag{F}% + \protected@edef\the@string{#1}% + \def\@thestring{}\def\make@cap{F}% + \expandafter\eat@noTitleWord\the@string\string@end% +} + +\def\eat@noTitleWord{\def\make@cap{F}\IfNextToken\string@end% + {\@gobble}% + {\title@string{\eat@noTitleWord}}% +} + +\newcommand\title@word[1]{% + \def\symbol@flag{F}% + \protected@edef\the@string{#1}% + \def\@thestring{}\def\make@cap{T}% + \expandafter\eat@TitleWord\the@string\string@end% +} + +\def\eat@TitleWord{\IfNextToken\string@end% + {\@gobble}% + {\title@string{\eat@TitleWord}}% +} + +\def\@symboli{\noexpand\`} +\def\@symbolii{\noexpand\'} +\def\@symboliii{\noexpand\^} +\def\@symboliv{\noexpand\"} +\def\@symbolv{\noexpand\~} +\def\@symbolvi{\noexpand\=} +\def\@symbolvii{\noexpand\.} +\def\@symbolviii{\noexpand\u} +\def\@symbolix{\noexpand\v} +\def\@symbolx{\noexpand\H} +\def\@symbolxi{\noexpand\t} +\def\@symbolxii{\noexpand\c} +\def\@symbolxiii{\noexpand\d} +\def\@symbolxiv{\noexpand\b} +\def\@symbolxv{\oe} + \def\uc@symbolxv{\OE} +\def\@symbolxvi{\ae} + \def\uc@symbolxvi{\AE} +\def\@symbolxvii{\o} + \def\uc@symbolxvii{\O} +%\def\@symbolxviii{\aa} +% \def\uc@symbolxviii{\AA} +%\def\@symbolxix{\l} +% \def\uc@symbolxix{\L} +\newcounter{dia@count} + +\def\title@string#1#2{% + \if T\make@cap% + \setcounter{dia@count}{1}% + \if F\symbol@flag% + \whiledo{\value{dia@count} < 18}{% + \ifthenelse{\equal{\csname @symbol\roman{dia@count}\endcsname}% + {#2}}{% +%BEGIN IFDIACRIT + \ifthenelse{\value{dia@count} < 15}{% +%IF = DIACRIT<15 + \protected@edef\di@critic% + {\csname @symbol\roman{dia@count}\endcsname}% + \def\symbol@flag{D}% + \setcounter{dia@count}{99}% INDICATING DICRIT JUST FOUND + }{% +%IF = NATSYM + \protected@edef\di@critic% + {\csname uc@symbol\roman{dia@count}\endcsname}% + \setcounter{dia@count}{90}% >19 AND <99 MEANS NON-DIACRIT SYMBOL + \def\symbol@flag{N} + }% + }{% +%END IF = DIACRIT +%IFNOT = DIACRIT + \addtocounter{dia@count}{1}}% + }% END WHILEDO + \fi% + \ifthenelse{\value{dia@count} < 99}{% + \if D\symbol@flag% FOR DIACRIT, ONCE ARGUMENT IS IN #2, TO BE CAPPED + \def\next@char{\di@critic#2}% + \def\symbol@flag{F}% + \else% + \if N\symbol@flag% FOR NATSYM TO BE CAPITALIZED + \def\next@char{\di@critic}% + \def\symbol@flag{F}% + \else% FOR ANY OTHER CHARACTER TO BE CAPITALIZED + \def\next@char{#2}% + \fi% + \fi% + \ifthenelse{\equal{\cmd@flag}{#2}}{\def\make@cap{T}}{% + \protected@edef\@thestring{\@thestring\uppercase{\next@char}}% + \def\make@cap{F}% + \@checkfornewgroup{#2}% + }% + }{}% + \else% FOR CHARACTERS NOT TO BE CAPITALIZED + \ifthenelse{\equal{\cmd@flag}{#2}}{\def\make@cap{T}}{% + \protected@edef\@thestring{\@thestring#2}% + \@checkfornewgroup{#2}% + }% + \fi% + #1} + +\def\@checkfornewgroup#1{% + \ifthenelse{\equal{-}{#1}}{\def\make@cap{T}}{% + \ifthenelse{\equal{(}{#1}}{\def\make@cap{T}}{% + \ifthenelse{\equal{[}{#1}}{\def\make@cap{T}}{% + \ifthenelse{\equal{\{}{#1}}{\def\make@cap{T}}{% + \ifthenelse{\equal{`}{#1}}{\def\make@cap{T}}{}% + }% + }% + }% + }% +} + +%%%%%%%%%%%%%%%%%% +% DAVID CARLISLE GREATLY ASSISTED WITH THE \get@argsC COMMAND LOGIC + +\def\string@@@end{$\SaveHardspace} +\def\converttilde{F} +\newcounter{arg@@@index} +\let\SaveHardspace~%%% +\def\the@@@rule{\rule{.8ex}{1.6ex}}% + +\def\get@argsC#1{% + \if T\converttilde\def~{ }\else\catcode`~=12\fi + \protected@edef\the@@@string{#1}% + \setcounter{arg@@@index}{0}% + \lowercase{\expandafter\parse@@@Block\the@@@string} \string@@@end + \let~\SaveHardspace% + \catcode`~=13% +} + +\def\parse@@@Block#1 {% + \stepcounter{arg@@@index}% + \@namedef{arg\roman{arg@@@index}}{#1}% + \ifthenelse{\equal{\argi}{}}{\addtocounter{arg@@@index}{-1}}{}% + \futurelet\tmp\parse@@@Block@@@} + +\def\parse@@@Block@@@{% +\ifx\tmp\string@@@end\edef\narg{\thearg@@@index}\expandafter\@gobble +\else\expandafter\parse@@@Block\fi} + +%%%%%%%%%%%% + +\let\sv@tiny\tiny +\let\sv@scriptsize\scriptsize +\let\sv@footnotesize\footnotesize +\let\sv@small\small +\let\sv@normalsize\normalsize +\let\sv@large\large +\let\sv@Large\Large +\let\sv@LARGE\LARGE +\let\sv@huge\huge +\let\sv@huge\Huge + +\let\make@lttr\makeatletter% +\let\make@othr\makeatother% + +\newcommand\noatinsidetc{% + \def\make@lttr{} + \def\make@othr{} +} + +\def\restore@sizes{% + \let\tiny\sv@tiny% + \let\scriptsize\sv@scriptsize% + \let\footnotesize\sv@footnotesize% + \let\small\sv@small% + \let\normalsize\sv@normalsize% + \let\large\sv@large% + \let\Large\sv@Large% + \let\LARGE\sv@LARGE% + \let\huge\sv@huge% + \let\huge\sv@Huge% + \make@othr% +} + +% THE \makeatletter IS REQUIRED FOR PROCESSING FONTSIZE CHANGES +\def\digest@sizes{% +\make@lttr% +\def\tiny{\unskip\noexpand\sz@tiny\SoftSpace}% +\def\sz@tiny{\noexpand\sv@tiny}% +% +\def\scriptsize{\unskip\noexpand\sz@scriptsize\SoftSpace}% +\def\sz@scriptsize{\noexpand\sv@scriptsize}% +% +\def\footnotesize{\unskip\noexpand\sz@footnotesize\SoftSpace}% +\def\sz@footnotesize{\noexpand\sv@footnotesize}% +% +\def\small{\unskip\noexpand\sz@small\SoftSpace}% +\def\sz@small{\noexpand\sv@small}% +% +\def\normalsize{\unskip\noexpand\sz@normalsize\SoftSpace}% +\def\sz@normalsize{\noexpand\sv@normalsize}% +% +\def\large{\unskip\noexpand\sz@large\SoftSpace}% +\def\sz@large{\noexpand\sv@large}% +% +\def\Large{\unskip\noexpand\sz@Large\SoftSpace}% +\def\sz@Large{\noexpand\sv@Large}% +% +\def\LARGE{\unskip\noexpand\sz@LARGE\SoftSpace}% +\def\sz@LARGE{\noexpand\sv@LARGE}% +% +\def\huge{\unskip\noexpand\sz@huge\SoftSpace}% +\def\sz@huge{\noexpand\sv@huge}% +% +\def\Huge{\unskip\noexpand\sz@Huge\SoftSpace}% +\def\sz@Huge{\noexpand\sv@Huge}% +} + +\endinput diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index 5842ce7504d..09a90a96a16 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -433,7 +433,7 @@ my @TLP_working = qw( tikzinclude tikzorbital tikzpagenodes tikzpfeile tikzposter tikzscale tikzsymbols timetable tipa tipa-de - titlefoot titlepages titlepic titleref titlesec titling + titlecaps titlefoot titlepages titlepic titleref titlesec titling tkz-base tkz-berge tkz-doc tkz-euclide tkz-fct tkz-graph tkz-kiviat tkz-linknodes tkz-orm tkz-tab tlc2 diff --git a/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc b/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc index 7a122f9f5b8..66ef763ffca 100644 --- a/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc @@ -807,6 +807,7 @@ depend thumbs depend thumby depend ticket depend timesht +depend titlecaps depend titlefoot depend titlepic depend titleref diff --git a/Master/tlpkg/tlpsrc/titlecaps.tlpsrc b/Master/tlpkg/tlpsrc/titlecaps.tlpsrc new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlpsrc/titlecaps.tlpsrc |