% % \iffalse meta-comment % % Copyright 2024 Brian Dunn % % 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.3 or later is part of all distributions of LaTeX % version 2005/12/01 or later. % % \fi % % \iffalse %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{verifycommand} % [2024/09/03 v1.10 Verify definitions have not changed.] % %<*driver> \documentclass{ltxdoc} \newcommand*{\mypackagename}{verifycommand} \newcommand{\quicksummary}{Verifies definitions have not changed.} % \usepackage{lmodern} \usepackage{erewhon} \usepackage{roboto} % \usepackage{sourcesanspro} \usepackage{inconsolata} % \usepackage{libertine} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{textcomp} % provides \degree, \textquotesingle, \textmu \newcommand*{\TakeFourierOrnament}[1]{{% \fontencoding{U}\fontfamily{futs}\selectfont\char#1}} \newcommand*{\textwarning}{\TakeFourierOrnament{66}} % copy/paste special unicode symbols: \input{glyphtounicode} \pdfglyphtounicode{prime}{2032}% hex \pdfglyphtounicode{diameter}{2300}% diameter \pdfglyphtounicode{warningsign}{26A0}% warning sign \pdfgentounicode=1 \usepackage{newunicodechar} \newunicodechar{ff}{ff} \newunicodechar{fi}{fi} \newunicodechar{fl}{fl} \newunicodechar{ffi}{ffi} \newunicodechar{ffl}{ffl} % \newunicodechar{°}{\degree} \newunicodechar{ρ}{\ensuremath{\rho}} \newunicodechar{⨯}{\texttimes} \newunicodechar{⁄}{\textfractionsolidus} % \newunicodechar{®}{\textregistered} % \newunicodechar{©}{\textcopyright} \newunicodechar{—}{---} \newunicodechar{–}{--} % \newunicodechar{”}{''} % \newunicodechar{“}{``} % \newunicodechar{§}{\S} % \newunicodechar{¶}{\P} % \newunicodechar{†}{\dag} \newunicodechar{‡}{\ddag} \newunicodechar{⚠}{\textwarning} \usepackage{etoolbox} \usepackage{metalogox} \usepackage{microtype} \usepackage{nowidow} \usepackage[svgnames]{xcolor} \definecolor{myurlcolor}{rgb}{0,0,.7} \definecolor{mylinkcolor}{rgb}{.7,0,0} \definecolor{codecolor}{rgb}{0,.4,.2} \definecolor{overviewcolor}{rgb}{0,.2,.4} %\usepackage{graphicx} %\graphicspath{{images/}} %\usepackage{enumitem} \usepackage{needspace} %\usepackage{array} %\usepackage{booktabs} %\usepackage{threeparttable} %\usepackage{fancybox}% must be loaded before fancyvrb %\usepackage{fancyvrb} %\usepackage{caption} %\usepackage{newfloat} %\captionsetup{labelfont={small,bf},textfont={small,bf}} %\captionsetup*[figure]{ % style=default, justification=centering, % margin=0pt, parskip=0pt, skip=2ex, % labelfont={small,bf},textfont={small,bf} %} %\captionsetup*[table]{ % style=default, justification=centering, % margin=0pt, parskip=0pt, skip=1ex, % labelfont={small,bf},textfont={small,bf}, % position=top %} %\captionsetup*[subfigure]{ % style=default, justification=centering, % margin=0pt, parskip=0pt, skip=2ex, % labelfont={small},textfont={small} %} %\captionsetup*[subtable]{ % style=default, justification=centering, % margin=0pt, parskip=0pt, skip=1ex, % labelfont={small},textfont={small}, % position=top %} %\captionsetup*[wrapfigure]{ % style=default, justification=centering, % margin=0pt, parskip=0pt, skip=2ex, % labelfont={small,bf},textfont={small,bf} %} %\captionsetup*[wraptable]{ % style=default, justification=centering, % margin=0pt, parskip=0pt, skip=1ex, % labelfont={small,bf},textfont={small,bf} %} %\usepackage{blindtext} %\usepackage{tikz} %\usetikzlibrary{positioning,fit,backgrounds,calc,shapes.geometric,shadows} %\usepackage[framemethod=tikz]{mdframed} %\mdfdefinestyle{boxroundshadow}{linewidth=1pt,innerleftmargin=0in,innerrightmargin=0in,% %innertopmargin=0in,innerbottommargin=0in,% %align=center,roundcorner=3pt,shadow=true,shadowcolor=black!50,shadowsize=4pt,% %leftmargin=0pt,rightmargin=0pt,% %frametitlebackgroundcolor=black!15,% %skipabove=0ex,skipbelow=0ex,% %frametitlerulewidth=1pt,frametitleaboveskip=5pt,% %} %\newmdenv[style=boxroundshadow,align=center]{mdtightframe} %\newmdenv[style=boxroundshadow,align=center,% % innertopmargin=3pt,innerbottommargin=3pt,% % innerleftmargin=3pt,innerrightmargin=3pt]{mdlooseframe} \usepackage[normalem]{ulem} %\usepackage{tocdata}[2019/03/21]% v2.02 or later \usepackage{tocloft} \setlength{\cftsubsecnumwidth}{3em} \setlength{\cftsubsubsecindent}{2.8em} \setlength{\cftsubsubsecnumwidth}{4em} \setlength{\cftbeforesubsecskip}{1ex} % \usepackage{titletoc} \usepackage{titleps} \newpagestyle{pageheadfoot}{ \headrule \sethead{\pkg{\mypackagename}}{}{\thepage} % \renewcommand{\makefootrule}{\rule[2.5ex]{\linewidth}{.4pt}} \setfoot{}{}{} } \pagestyle{pageheadfoot} % Indexing, logos, \Describexxxx, etc: \usepackage{dtxdescribe}[2023/01/03] \usepackage{splitidx} \newindex[Index of Objects]{idx} %\newindex[General Index]{gen} % \newindex[Troubleshooting Index]{trb} %\newindex[Index of Indexes]{meta} \makeindex \newcommand*{\gindex}[1]{\sindex[gen]{#1}\ignorespaces} % \trouble[watchout phrase]{index entry} \newcommand*{\trouble}[2][]{% \ifblank{#1}{}{% \watchout[#1]% }% % \sindex[trb]{#2}% \gindex{#2}% \ignorespaces% } \newcommand*{\MDfive}{\begingroup\textup{\acro{MD5}}\endgroup} %\setlength{\floatsep}{5ex plus 1ex minus 1ex} %\setlength{\dblfloatsep}{5ex plus 1ex minus 1ex} \usepackage{\mypackagename} %\usepackage[disable]{\mypackagename} \AtBeginDocument{ \hypersetup{% pdfinfo={% Title={The LaTeX \mypackagename\ package},% Author={Brian Dunn},% Subject={Verify LaTeX definitions are unchanged.},% Keywords={LaTeX}% colorlinks,% linkcolor=mylinkcolor,% urlcolor=myurlcolor,% pageanchor=true, }} \pdfstringdefDisableCommands{ \def\quad{ } \def\\{ } \def\pkg#1{#1} \def\cs#1{\textbackslash#1} \def\env#1{#1} \def\,{ } \def\prog#1{#1} \def\LuaLaTeX{LuaLaTeX} \def\XeLaTeX{XeLaTeX} \def\TeX{TeX} \def\LaTeX{LaTeX} \def\Dash{ --- } \def\dash{ -- } \def\element#1{#1} \def\attribute#1{#1} \def\MDfive{MD5} } }% AtBeginDocument \AddToHook{begindocument/before}{% Before .aux file is loaded. \usepackage{cleveref}% If needed. } \setlength{\marginparsep}{1em} \setlength{\marginparpush}{.7ex} \setlength{\IndexMin}{40ex} \setcounter{IndexColumns}{2} \DisableCrossrefs \CodelineIndex \RecordChanges \begin{document} \DocInput{\mypackagename.dtx} \end{document} % % % % \fi % % \iffalse %<*package> % \fi % % \changes{v1.00}{2024/01/11}{\ 2024/01/11 Initial version.} % \changes{v1.10}{2024/09/03}{\ 2024/09/03} % \GetFileInfo{\mypackagename.sty} % % \DoNotIndex{\newcommand,\renewcommand,\addtocounter,\begin,\end,\begingroup,\endgroup} % \DoNotIndex{\global,\ifbool,\ifthenelse,\isequivalentto,\let} % \DoNotIndex{\booltrue,\boolfalse} % \expandafter\DoNotIndex\expandafter{\detokenize{\(,\),\,,\\,\#,\$,\%,\^,\_,\~,\ ,\&,\{,\}}} % % % \thispagestyle{empty} % \begin{center} % \vfill % ^^A \includegraphics[width=.3\linewidth]{\mypackagename_logo.pdf} % \vfill % {\Huge The \LaTeX\\ % \pkg{\mypackagename}\\ % Package} % \bigskip % % \fileversion{} --- \filedate % % \bigskip % % {\small\textcopyright{} 2024} Brian Dunn\\ \small \url{https://github.com/bdtc/verifycommand} % % \vspace{.5in} % % {\Large \textup{\quicksummary}} % % % \vfill % % % ^^A % \title{The \pkg{verifycommand} package\thanks{This document % ^^A % corresponds to \pkg{verifycommand}~\fileversion, % ^^A % dated \filedate.}} % ^^A % \author{{\small\textcopyright{} 2016} Brian Dunn\\ \small \texttt{bd@BDTechConcepts.com}} % ^^A % \published{} % ^^A % \subtitle{\textup{Subtitle}} % ^^A % % ^^A % \maketitle % % \vfill % % % \begin{abstract} % \noindent % For package authors who patch code from other packages. % % To improve reliability, % the \pkg{verifycommand} package provides a way to verify that % macros or environments have not changed since the patches were % last designed. % This may be checked before applying the patch. % If a definition is not as expected, a warning is issued. % At the end of the compile, a list of all changed definitions is displayed. % % Conditionals are provided, allowing multiple versions of a definition % to be tested and patched, warning if no known version is found. % Conditionals also allow the package to verify that several macros % are unchanged before taking a single common action. % % \vfill % % \footnotesize % \begin{description} % \item[License:] \ % % 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.3 or later is part of all distributions of LaTeX % version 2005/12/01 or later. % \end{description} % % \end{abstract} % % \vspace*{\fill} % \vspace*{\fill} % \vspace*{\fill} % \end{center} % \clearpage % % \tableofcontents % ^^A \listofdtxexamplefloats % ^^A \listoffigures % ^^A \listoftables % % % \thispagestyle{pageheadfoot} % % \clearpage % %^^A \part{verifycommand.sty} % % \section{Introduction} % % Patching a macro or environment from another package risks % the possibility that the other author has made an update % and changed something unexpected, % breaking your own package when it tries to apply the patch. % % The traditional way to check a definition you wish to modify % is to copy the expected definition into your package under a new name, % then compare to see if the current definition % is the same as it was when your package was first created. % For a few definitions this may work well, but as the number % of patches goes up things get more and more unwieldy. % % The \pkg{verifycommand} package uses \MDfive\ checksums instead of % copying entire definitions. % If something has changed, a warning is issued telling the % name of the defintion, and optionally telling the name of your % own package and the package being modified. % This improves code reliability, and allows package authors % to get an early warning when an author of some other package % has made an unexpected change. % % In many cases, the patch or replacement may still function correctly % even when the original has changed in some way. % For this reason, only a warning is issued, not an error. % % % \section{How it works} % % \cs{VerifyCommand} and \cs{VerifyEnvironment} are used to test % whether a definition has changed. % Each definition is given an \MDfive\ checksum, which is compared to % the expected checksum given as arguments of \cs{VerifyCommand} % and \cs{VerifyEnvironment}. % If a checksum does not match, a warning is issued, % flagging the definition for attention. % % The \MDfive\ checksum is of the text of the code part of the underlying definition, % as it would be displayed by the \cs{meaning} command. % For environments, the end code is checked separately. % The check detects changes in the replacement text of the definition, % and may or may not detect changes in the number or type of parameters, % \cs{long}, or type of robustness, depending on the type of definition. % Some definitions may have the same checksum if they have the same % replacement code but different argument types, for example % a \cs{NewDocumentCommand} with two mandatory arguments vs another with one optional % and one mandatory, if they both have the same replacement code. % % When something does not match, the current checksum is printed to % the terminal, and the author may copy/paste that into the parameter of % \cs{VerifyCommand} or \cs{VerifyEnvironment} to update the % expected values. % % % \section{Warnings} % % \changes{v1.10}{2024/09/03}{Docs: Added Warnings section.} % % The document \textit{\LaTeX\ for authors} (\cmds{texdoc usrguide} % recommends the use of \LaTeX\ hooks where possible (\cmds{texdoc lthooks}). % % Commands created with \cs{NewDocumentCommand} and related may % \watchout[kernel changes] % change their definitions when the inner workings of % \cs{NewDocumentCommand} are optimized. % When this occurs, any checksums for these commands will % change, even though the associated patches probably will continue to work. % If you use \pkg{verifycommand} for these commands, expect the % checksums to need updates at some point in the future. % % Use \cs{NewCommandCopy} and \cs{NewEnvironmentCopy} to copy commands % for reuse. These work with all kinds of commmand definitions. % See \cmds{texdoc usrguide} for details. % % Use \cs{ShowCommand} or \cs{ShowEnvironment} to see an existing definition, % which again works with all forms of commands. % % % \section{How to use \pkg{verifycommand}} % % % \subsection{The user interface} % % \changes{v1.10}{2024/06/25}{Docs: Added conditional tests.} % % In the following, \oarg{yourpackagename} is the package doing the % testing and patching, % and \oarg{theirpackagename} is the package which defines % the original macro. % Using these optional package names make it easier to find where % to make changes if needed. % % If there is only one optional argument, % \watchout[optional arguments] % it is used as \oarg{yourpackagename}, % to identify where to find the \cs{VerifyCommand} checksum entry. % The second optional argument identifies what is being patched, % in case it has been changed. % % \needspace{2\baselineskip} % \DescribeMacro{\VerifyCommand} \oarg{yourpackagename} \oarg{theirpackagename} % \marg{\cs{macroname}} \marg{\MDfive\ checksum} % % \needspace{3\baselineskip} % \DescribeMacro{\VerifyEnvironment} \oarg{yourpackagename} \oarg{theirpackagename} % \marg{\env{envname}} \\ % \fqquad \marg{begin \MDfive\ checksum} \marg{end \MDfive\ checksum} % % Use one of these macros just before patching a macro or environment, % as seen below. A test is performed to see if the definition % is as expected before applying a patch. % % Note that there is one checksum for \cs{VerifyCommand}, but there % are two checksums for an environment: once for the begin section % and one for the end section. % % It may be necessary to test for each of several possible versions of % a definition, then patch accordingly. The following test and apply a % true or false clause, without issuing a warning. % % \needspace{2\baselineskip} % \DescribeMacro{\IfVerifyCommand} \oarg{yourpackagename} \oarg{theirpackagename} % \marg{\cs{macroname}} \\ % \fqquad \marg{\MDfive\ checksum} \\ % \fqquad \marg{true} \marg{false} % % \needspace{3\baselineskip} % \DescribeMacro{\IfVerifyEnvironmentBegin} \oarg{yourpackagename} \oarg{theirpackagename} % \marg{\env{envname}} \\ % \fqquad \marg{begin \MDfive\ checksum} \\ % \fqquad \marg{true} \marg{false} % % \needspace{3\baselineskip} % \DescribeMacro{\IfVerifyEnvironmentEnd} \oarg{yourpackagename} \oarg{theirpackagename} % \marg{\env{envname}} \\ % \fqquad \marg{end \MDfive\ checksum} \\ % \fqquad \marg{true} \marg{false} % % Tests may be done as a group, either to try several versions of the same % definition, or to verify several definitions and act if any of them fail: % % \DescribeMacro{\TestVerifyCommands} Starts a group of tests. % % \DescribeMacro{\IfVerifyCommandPassed} \marg{true} \marg{false} % \quad Act if any of a group passed. % May be used to try to patch multiple versions of a command. % % \DescribeMacro{\IfVerifyCommandFailed} \marg{true} \marg{false} % \quad Act if any of a group failed. % May be used to verify several definitions are unchanged. % % A warning may be also issued: % % \DescribeMacro{\VERCMDWarning} \marg{yourpackage} \marg{theirpackage} \marg{defn name} % \quad Used to issue a warning that the macro has changed. % % See \cref{sec:conditionals} for examples of conditional tests. % % % \subsection{Placing the macros} % % When first using \pkg{verifycommand}, use empty checksums, placing % \cs{VerifyCommand} or \cs{VerifyEnvironment} before each place % where something gets patched. % This is probably not required where things are entirely replaced, % or prepended or appended. % % \begin{sourceverb} % \VerifyCommand{\LaTeX}{} % (patch \LaTeX here) % % \VerifyCommand[mypackage]{\textcolor}{} % (patch \textcolor here) % % \VerifyCommand[mypackage][graphics]{\rotatebox}{} % (patch \rotatebox here) % % \VerifyEnvironment{tabbing}{}{} % (patch tabbing here) % \end{sourceverb} % % % \subsection{Finding the checksums of the current definitions} % \changes{v1.10}{2024/06/25}{Docs: ``Finding checksums'' reorganized.} % % The warnings are issued and the correct checksums are given. % The type of warning depends on the usage: % \begin{itemize} % \item Verifying \cs{LaTeX} would print a warning showing % the correct \MDfive\ checksum. % \begin{sourceverb} % Warning: A definition has changed: % \LaTeX % (FAAAC6146C9A80F46A1F029B67923851) % on input line 464. % \end{sourceverb} % \item Verifying \cs{textcolor} would do the same, % but as a \cs{PackageWarning} from \pkg{mypackage}, % which is the package doing the testing. % \begin{sourceverb} % Package mypackage Warning: A definition has changed: % (mypackage) \textcolor % (mypackage) (E1E2B5A908AA1BCDDF6BEA038596A381) % (mypackage) on input line 465. % \end{sourceverb} % \item Verifying \cs{rotatebox} would also issue a warning from \pkg{mypackage}, % but also mention the package being tested, \pkg{graphics}. % \begin{sourceverb} % Package mypackage Warning: A definition has changed: % (mypackage) graphics: \rotatebox % (mypackage) (2472999B02C97AC847128AF24C55D150) % (mypackage) on input line 466. % \end{sourceverb} % \item Verifying \env{tabbing} issues a separate warning % for the begin and end sections. % \begin{sourceverb} % Warning: A definition has changed: % tabbing % (1AD73B4527AD30969CF3219F2FB1306B) % on input line 518. % % Warning: A definition has changed: % (end)tabbing % (E8326AC43EE0A6E922A20F2A798BD177) % on input line 518. % \end{sourceverb} % \end{itemize} % % % At the end of the compile, a summary is given: % % \begin{sourceverb} % -------------------------------- % Package verifycommand Warning: Definitions have changed. % Patches for the following macros may need to be updated. % See the previous warnings for line numbers. % % Syntax: Patching pkg -> Defining pkg: Macro (checksum) % ----- % (verifycommand) \LaTeX % (FAAAC6146C9A80F46A1F029B67923851) % (verifycommand) mypackage -> \textcolor % (E1E2B5A908AA1BCDDF6BEA038596A381) % (verifycommand) mypackage -> graphics: \rotatebox % (2472999B02C97AC847128AF24C55D150) % (verifycommand) tabbing % (1AD73B4527AD30969CF3219F2FB1306B) % (verifycommand) (end)tabbing % (E8326AC43EE0A6E922A20F2A798BD177) % -------------------------------- % \end{sourceverb} % % % \subsection{Assigning the checksums} % Copy the checksums from the warnings messages into the source. % When this is done, there are no more \pkg{verifycommand} warnings % unless one of these defintions changes: % % \begin{sourceverb} % \VerifyCommand{\LaTeX}{FAAAC6146C9A80F46A1F029B67923851} % (patch \LaTeX here) % % \VerifyCommand[mypackage]{\textcolor} % {E1E2B5A908AA1BCDDF6BEA038596A381} % (patch \textcolor here) % % \VerifyCommand[mypackage][graphics]{\rotatebox} % {2472999B02C97AC847128AF24C55D150} % (patch \rotatebox here) % % \VerifyEnvironment{tabbing} % {1AD73B4527AD30969CF3219F2FB1306B}% beginning code % {E8326AC43EE0A6E922A20F2A798BD177}% endind code % (patch tabbing here) % \end{sourceverb} % % % \subsection{When a definition has changed} % % When something being verified changes at a later time, the resulting % warning will let the user know that the patches may not work % as expected. % Because the test is done before the patch, % this warning will be issued before the patch is even attempted. % % When testing many packages in bulk, a utility such as \cmds{grep} % can report which macros have changed. % Search the log file for ``\texttt{(verifycommand)}''. % % % \subsection{Testing for changed macros} % \label{sec:conditionals} % % \changes{v1.10}{2024/06/25}{Docs: Added conditional tests.} % % To test to see if a macro or environment has changed, use % \cs{IfVerifyCommand}, \cs{IfVerifyEnvironmentBegin}, % or \cs{IfVerifyEnvironmentEnd}. % % Example: % \begin{sourceverb} % \IfVerifyCommand[mypackage][LaTeX kernel]{\LaTeX}{123}{True}{False} % \end{sourceverb} % Result: \IfVerifyCommand[mypackage][LaTeX kernel]{\LaTeX}{}{True}{False} % % Example: % \begin{sourceverb} % \IfVerifyCommand[mypackage][LaTeX kernel]{\LaTeX} % {FAAAC6146C9A80F46A1F029B67923851} % {True}{False} % \end{sourceverb} % Result: % \IfVerifyCommand[mypackage][LaTeX kernel]{\LaTeX} % {FAAAC6146C9A80F46A1F029B67923851} % {True}{False} % (Assuming \cs{LaTeX} has not actually changed since % this manual was generated.) % % Example: % \begin{sourceverb} % \IfVerifyEnvironmentEnd[mypackage][LaTeX kernel]{tabbing} % {E8326AC43EE0A6E922A20F2A798BD177} % {True}{False} % \end{sourceverb} % Result: % \IfVerifyEnvironmentEnd[mypackage][LaTeX kernel]{tabbing} % {E8326AC43EE0A6E922A20F2A798BD177} % {True}{False} % % If the \pkg{verifycommand} package is disabled, these tests % will always return true. % % These tests do not issue warnings if the test fails, so they may % be used to test against several possible definitions, chosing the % appropriate patch depending on which match is found. % % To try to patch multiple versions of the same command, % and issue a warning if no match is found: % % \begin{sourceverb} % \TestVerifyCommands % % \IfVerifyCommand[mypackage][theirpackage]{\theirmacro} % {12312312312312312321312312312312} % {(Patch an older version of the macro.)} % % \IfVerifyCommand[mypackage][theirpackage]{\theirmacro} % {45645645645645645645645645645645} % {(Patch a newer version of the macro.)} % % \IfVerifyCommandPassed % {}% One of the patches worked. % {\VERCMDWarning{mypackage}{theirpackage}{\theirmacro}} % \end{sourceverb} % % To verify several commands have not changed: % % \begin{sourceverb} % \TestVerifyCommands % % \VerifyCommand[mypackage][theirpackage]{\firstmacro} % {78978978978978978978978978978978} % \VerifyCommand[mypackage][theirpackage]{\secondmacro} % {27272727272727272727277272727272} % \VerifyCommand[mypackage][theirpackage]{\thirdmacro} % {84838483848384838483848384838483} % % \IfVerifyCommandFailed % {Something is not correct. (Warnings have been issued above.)} % {}% All are fine. % \end{sourceverb} % % % \subsection{Disabling the package} % % \pkg{verifycommand} relies on knowing the internal structure of % various kinds of definitions. It is possible that these may change, % causing endless warnings for that kind of definition. % Should that happen, it will be necessary to disable the \pkg{verifycommand} % package until it can be updated. % Use the \optn{disable} option to do so. % % \begin{sourceverb} % \usepackage[disable]{verifycommand} % \end{sourceverb} % % Package warnings will stop, % and the conditional tests will always return true. % % If the package is disabled, the boolean \bool{VERCMDenable} % will be |false|. This may be used to help decide which patches % to apply as a default. % % % ^^A To trigger the checksums to be copied into the exmaples: % \typeout{(verifycommand): The following warnings that definitions have changed} % \typeout{are expected, and are for demonstration purposes:} % \VerifyCommand{\LaTeX}{} % \VerifyCommand[mypackage]{\textcolor}{} % \VerifyCommand[mypackage][graphics]{\rotatebox}{} % \VerifyEnvironment{tabbing}{}{} % % \clearpage % % ^^A \StopEventually{\PrintChanges\PrintIndex} % % \makeatletter % % \StopEventually{ % ^^A \part{Change History and Index} % ^^A \part{Change History} % % % \pagestyle{plain} % % ^^A Each index has a prologue which creates its own \part, label, % ^^A and meta index entry. % \GlossaryPrologue{ % \part{Change History} % ^^A \section{Chg Hist} % \label{sec:changehistory} % ^^A \sindex[meta]{Change History} % \markboth{{Change History}}{{Change History}} % % ^^A For the most recent changes, see page \pageref{sec:changesend}. % % } % \PrintChanges % \phantomsection % \label{sec:changesend} % \clearpage % % ^^A The instructions for the Index of Objects: % \IndexPrologue{ % \clearpage % \expandafter\part\expandafter{\indexname} % \label{sec:index\indexshortcut} % ^^A \sindex[meta]{\indexname} % \markboth{Index of Objects}{Index of Objects}% % % This is an index of macros, environments, booleans, counters, lengths, % packages, classes, options, keys, files, and various other programming objects. % Each is listed by itself, and also by category. % In some cases, they are further subdivided by [class]. % % Numbers written in italic refer to the page % where the corresponding entry is described; % numbers underlined refer to the % \ifcodeline@index % code line of the % \fi % definition. % ^^A ; numbers in roman refer to the % ^^A \ifcodeline@index % ^^A code lines % ^^A \else % ^^A pages % ^^A \fi % ^^A where the entry is used. % } % % \printindex[idx][Index of Objects] % % % ^^A The instructions for the General Index: % \IndexPrologue{ % \clearpage % \expandafter\part\expandafter{\indexname} % \label{sec:index\indexshortcut} % ^^A \sindex[meta]{\indexname} % % ^^A This is an index of instructions and concepts. % ^^A Look here when wondering how to do something, and % ^^A check the Troubleshooting Index when something goes wrong. % This is a general index, including how-to and troubleshooting. % } % % \printindex[gen][General Index] % % % ^^A% The instructions for the Troubleshooting Index: % ^^A% \IndexPrologue{ % ^^A% \clearpage % ^^A% \expandafter\part\expandafter{\indexname} % ^^A% \label{sec:index\indexshortcut} % ^^A% \sindex[meta]{\indexname} % ^^A% % ^^A% This index is a sorted reference of problems and solutions. % ^^A% In order to make it easier to locate a solution, % ^^A% the same issue may be addressed by more than one entry. % ^^A% % ^^A% Entries with higher page numbers are often duplicates of entries with % ^^A% lower page numbers, as the same warning may occur within the user manual % ^^A% and again within the source code for a given package. % ^^A% } % ^^A% % ^^A% \printindex[trb][Troubleshooting Index] % % % ^^A The meta index does not get a meta index entry pointing to itself: % \IndexPrologue{ % \clearpage % \expandafter\part\expandafter{\indexname} % \label{sec:index\indexshortcut} % } % % ^^A \printindex[meta][Index of Indexes] % % \typeout{--------------------------------} % \typeout{The following warning that} % \typeout{definitions have changed is an} % \typeout{example of the output of this} % \typeout{package, and is not evidence of} % \typeout{a problem with the verifycommand} % \typeout{manual or documentation.} % \typeout{--------------------------------} % % } % % \makeatother % % % % % \section{Code} % ^^A *source % % \subsection{Package requirements} % \begin{macrocode} \RequirePackage{etoolbox} \RequirePackage{iftex} % \end{macrocode} % % % \subsection{Package options} % % Package option to disable all functions. % % \DescribeBoolean{VERCMDenable} Is the package enabled? % \begin{macrocode} \newbool{VERCMDenable} \booltrue{VERCMDenable} % \end{macrocode} % % \DescribeOption{disable} Turn off all functions. % \begin{macrocode} \DeclareOption{disable}{% \boolfalse{VERCMDenable}% \typeout{----}% \typeout{Package verifycommand: Turned off by option 'disable'.}% \typeout{----}% } \ProcessOptions\relax % \end{macrocode} % % % \subsection{Support macros} % % \begin{macro}{\VERCMD@backslash} The literal |\| character. % % This is used later because some internal definitions use double |\\| as % part of their name. % \begin{macrocode} \catcode`\&=0 &catcode`&\=12 &def&VERCMD@backslash{\} &catcode`&\=0 \catcode`\&=4 % \end{macrocode} % \end{macro} % % % % % \subsection{\MDfive\ hashing} % % The \MDfive\ hash is used for \env{lateximage} filenames for \SVG\ math. % % The default definition if no MD5 function is found. % This will be changed below if an MD5 function is available. % \begin{macrocode} \newcommand{\VERCMD@mdfivesum}[1]{% \PackageError{verifycommand} {No MD5 macro was found} {% Verifycommand must find the macros \protect\pdfmdfivesum\space or \protect\mdfivesum.% } } % \end{macrocode} % % The default for \pdfLaTeX, \dviLaTeX, up\LaTeX, etc: % \begin{macrocode} \ifdef{\pdfmdfivesum} {\let\VERCMD@mdfivesum\pdfmdfivesum} {} % \end{macrocode} % % For \LuaLaTeX: % \begin{macrocode} \ifLuaTeX \RequirePackage{pdftexcmds} \let\VERCMD@mdfivesum\pdf@mdfivesum \fi % \end{macrocode} % % For \XeLaTeX: % \begin{macrocode} \ifXeTeX \@ifundefined{pdffivesum}{} {\let\VERCMD@mdfivesum\pdfmdfivesum} \@ifundefined{mdfivesum}{} {\let\VERCMD@mdfivesum\mdfivesum} \fi % \end{macrocode} % \begin{macro}{\VERCMD@mdfive} \marg{\cs{macroname}} \qquad % Compute \MDfive\ checksum, store in \cs{VERCMD@temp}. % \begin{macrocode} \def\VERCMD@mdfive#1{% \edef\VERCMD@temp{\VERCMD@mdfivesum{\meaning#1}}% } % \end{macrocode} % \end{macro} % % % \subsection{Issuing warnings} % % ^^A % \begin{macrocode} % ^^A \gdef\VERCMD@ProgError#1#2{% % ^^A \GenericError{% % ^^A (\jobname)\@spaces\@spaces\@spaces\@spaces % ^^A }{% % ^^A \jobname\ Error: #1% % ^^A }{% % ^^A Something has changed and the result may fail.% % ^^A }{#2}% % ^^A } % ^^A % \end{macrocode} % % % \begin{macro}{\VERCMD@whatchanged} Accumulates a list of changed definitions. % \begin{macrocode} \newcommand*{\VERCMD@whatchanged}{} % \end{macrocode} % \end{macro} % \DescribeBoolean{VERCMD@this@ltxcmd} True if this command is % defined by \cs{NewDocumentCommand} or related. % \begin{macrocode} \newbool{VERCMD@this@ltxcmd} \boolfalse{VERCMD@this@ltxcmd} % \end{macrocode} % \DescribeBoolean{VERCMD@failed@ltxcmd} True if any command that failed % was defined by \cs{NewDocumentCommand} or related. % \begin{macrocode} \newbool{VERCMD@failed@ltxcmd} \boolfalse{VERCMD@failed@ltxcmd} % \end{macrocode} % \begin{macro}{\VERCMD@addchanged} \marg{\MDfive sum} \marg{text} \qquad Add to the list of changed definitions. % \changes{v1.10}{2024/08/25}{Revised summary message.} % \changes{v1.10}{2024/08/28}{Added `\texttt{*}' if \cs{NewDocumentCommand} or related is used.} % \begin{macrocode} \newcommand*{\VERCMD@addchanged}[2]{% % \end{macrocode} % Newline control for pretty print. % \begin{macrocode} \ifdefempty{\VERCMD@whatchanged}% {}% {\apptocmd{\VERCMD@whatchanged}{^^J}{}{}}% % \end{macrocode} % ID the message as from \pkg{verifycommand}, add the text, % add the checksum. % \begin{macrocode} \apptocmd{\VERCMD@whatchanged}{% (verifycommand)\space\space#2^^J% \space\space\space\space\space\space\space\space\space\space% \space\space\space\space\space\space\space\space\space(#1)% }{}{}% % \end{macrocode} % Optionally add a |*| after the checksum if the command was % defined with \cs{NewCommand} or related. % \begin{macrocode} \ifbool{VERCMD@this@ltxcmd}{% \apptocmd{\VERCMD@whatchanged}{ *}{}{}% \booltrue{VERCMD@failed@ltxcmd}% }{}% \boolfalse{VERCMD@this@ltxcmd}% } % \end{macrocode} % \end{macro} % When the compile is finished, print the accumulated list of changed definitions. % \changes{v1.10}{2024/08/25}{Revised summary message.} % ^^A *date % \begin{macrocode} \AtEndDocument{ \ifdefempty{\VERCMD@whatchanged}{}{% \typeout{--------------------------------}% \typeout{Package verifycommand Warning: Definitions have changed.}% \typeout{Patches for the following macros may need to be updated.}% \typeout{See the previous warnings for line numbers.}% \typeout{}% \typeout{Syntax:\space\space Patching pkg -> Defining pkg: Macro (checksum)}% \typeout{-----}% \typeout{\VERCMD@whatchanged} \typeout{-----}% \typeout{Look for updates to these packages.} % \ifbool{VERCMD@failed@ltxcmd}{ \typeout{Any of the above marked with a * may be due to changes in LaTeX internals,} \typeout{the most recently known of which was 2023/12/01.} \typeout{If so, look for updates for the LaTeX sytem as well.} }{} % \typeout{--------------------------------} } } % \end{macrocode} % \begin{macro}{\VERCMD@ProgWarning} \marg{text} \qquad Warning without a package name. % \begin{macrocode} \def\VERCMD@ProgWarning#1{% \GenericWarning{% % (\jobname)\@spaces\@spaces% \@spaces\@spaces }{% Warning: #1% }% } % \end{macrocode} % \end{macro} % \begin{macro}{\VERCMDWarning} \marg{yourpackage} \marg{theirpackage} \marg{defn name} % % If no package names, print a general warning. % If package names are given, print a \cs{PackageWarning}. % Either way, also add to the summary report. % \changes{v1.10}{2024/08/25}{Revised warning message.} % \begin{macrocode} \newcommand*{\VERCMDWarning}[3]{% \ifblank{#1}% {% \VERCMD@ProgWarning{% A definition has changed:\MessageBreak \ifblank{#2}{}{#2: }\string#3\MessageBreak (\VERCMD@temp)\MessageBreak }% \expandafter\VERCMD@addchanged% \expandafter{\VERCMD@temp}{\string#3}% }% {% \PackageWarning{#1}{% A definition has changed:\MessageBreak% \ifblank{#2}{}{#2: }% \string#3\MessageBreak% (\VERCMD@temp)\MessageBreak% }% \expandafter\VERCMD@addchanged% \expandafter{\VERCMD@temp}{#1 -> \ifblank{#2}{}{#2: }\string#3}% }% } % \end{macrocode} % \end{macro} % % % \begin{macrocode} \ExplSyntaxOn % \end{macrocode} % % % % \subsection{User interface} % % % \DescribeBoolean{VERCMD@passed} True if any test passed. % \changes{v1.10}{2024/08/28}{Added test groups.} % \begin{macrocode} \newbool{VERCMD@passed} % \end{macrocode} % % \DescribeBoolean{VERCMD@failed} True if any test failed. % \changes{v1.10}{2024/08/28}{Added test groups.} % \begin{macrocode} \newbool{VERCMD@failed} % \end{macrocode} % % \begin{macro}{\TestVerifyCommands} % Starts a new set of \cs{VerifyCommand} tests, % after which the booleans will tell if any passed and if any failed. % \changes{v1.10}{2024/08/28}{Added test groups.} % \begin{macrocode} \newcommand*{\TestVerifyCommands} { \boolfalse{VERCMD@passed} \boolfalse{VERCMD@failed} } % \end{macrocode} % \end{macro} % % \begin{macro}{\IfVerifyCommandPassed} \marg{true} \marg{false} % If any of the \cs{VerifyCommand} tests passed, do the |true| clause. % If none of them passed, do the |false| clause. % \changes{v1.10}{2024/08/28}{Added test groups.} % \begin{macrocode} \newcommand*{\IfVerifyCommandPassed} {% \ifbool{VERCMD@passed}% {\let\VERCMD@tempa\@firstoftwo}% {\let\VERCMD@tempa\@secondoftwo}% \VERCMD@tempa% } % \end{macrocode} % \end{macro} % % \begin{macro}{\IfVerifyCommandFailed} \marg{true} \marg{false} % If any of the \cs{VerifyCommand} tests failed, do the |true| clause. % If none of them failed, do the |false| clause. % \changes{v1.10}{2024/08/28}{Added test groups.} % \begin{macrocode} \newcommand*{\IfVerifyCommandFailed} {% \ifbool{VERCMD@failed}% {\let\VERCMD@tempa\@firstoftwo}% {\let\VERCMD@tempa\@secondoftwo}% \VERCMD@tempa% } % \end{macrocode} % \end{macro} % % \begin{macro}{\IfVerifyCommand} \oarg{yourpackage} \oarg{theirpackage} % \marg{\cs{commandname}} \marg{\MDfive\ checksum} % \marg{true} \marg{false} % \changes{v1.10}{2024/06/25}{Added conditional tests.} % % Test for various kinds of definitions, and convert them to \MDfive\ checksums. % \begin{macrocode} \NewDocumentCommand{\IfVerifyCommand}{O{} O{} m m}{% % \end{macrocode} % % Only if the package is enabled: % \begin{macrocode} \ifbool{VERCMDenable}{% % \end{macrocode} % % Default to an un-detected definition type: % \begin{macrocode} \edef\VERCMD@temp{Unknown~definition}% % \end{macrocode} % % Will become true if found \cs{NewDocumentCommand} or related. % \begin{macrocode} \boolfalse{VERCMD@this@ltxcmd} % \end{macrocode} % % For \cs{NewDocumentCommand}, the macro name is ``|\name code|'' % with a space in the middle. % \begin{macrocode} % % NewDocumentCommand: \ifcsdef{\cs_to_str:N #3~code}% {% \booltrue{VERCMD@this@ltxcmd}% \expandafter\VERCMD@mdfive% \csname \cs_to_str:N #3~code\endcsname% }% {% % \end{macrocode} % % For \cs{DeclareRobustCommand} with an optional argument, % the macro name is ``|\\name |'' with a two backslashes and a trailing space. % \begin{macrocode} % % DeclareRobustCommmand with option: \ifcsdef{\VERCMD@backslash\cs_to_str:N #3~}% {% \expandafter\VERCMD@mdfive% \csname \cs_to_str:N #3~code\endcsname% }% {% % \end{macrocode} % % For \cs{DeclareRobustCommand}, the macro name is ``|\name |'' % with a trailing space. % \begin{macrocode} % % DeclareRobustCommand: \ifcsdef{\cs_to_str:N #3~}% {% \expandafter\VERCMD@mdfive% \csname \cs_to_str:N #3~\endcsname% }% {% % \end{macrocode} % % For \cs{newcommand} with an option, the macro name is ``|\\name|'', % with two backslashes. % \begin{macrocode} % % newcommand w/ option: \ifcsdef{\VERCMD@backslash\cs_to_str:N #3}% {% \expandafter\VERCMD@mdfive% \csname % \VERCMD@backslash% \cs_to_str:N #3% \endcsname% }% % \end{macrocode} % % For \cs{newcommand}, the macro name is ``|\name|''. % % If none match, the default unknown definition warning is shown % in place of the checksum. % \begin{macrocode} {% % % newcommand: \ifdef{#3}% {\VERCMD@mdfive#3}% {}% }% }% }% }% % \end{macrocode} % % If the checksum matches the expected value, do the following % |true| clause, else do the following |false| clause. % Also track the true and false tests for \cs{IfVerifyCommandPassed} % and \cs{IfVerifyCommandFailed}. % \changes{v1.10}{2024/08/28}{Added test groups.} % \begin{macrocode} \ifdefstring{\VERCMD@temp}{#4}% {% \booltrue{VERCMD@passed}% \let\VERCMD@tempa\@firstoftwo% }% {% \booltrue{VERCMD@failed}% \let\VERCMD@tempa\@secondoftwo% }% }% if package enabled {\let\VERCMD@tempa\@firstoftwo}% if package not enabled \VERCMD@tempa% } % \end{macrocode} % \end{macro} % % % \begin{macro}{\VerifyCommand} \oarg{yourpackage} \oarg{theirpackage} % \marg{\cs{commandname}} \marg{\MDfive\ checksum} % % Test for various kinds of definitions, and convert them to \MDfive\ checksums. % \begin{macrocode} \NewDocumentCommand{\VerifyCommand}{O{} O{} m m}{% \ifblank{#1}{% #1 blank \IfVerifyCommand{#3}{#4}{}{\VERCMDWarning{}{}{#3}}% }% #1 blank {% #1 given \ifblank{#2}{% #2 blank \IfVerifyCommand[#1]{#3}{#4}{}{\VERCMDWarning{#1}{}{#3}}% }% #2 blank {% #2 given \IfVerifyCommand[#1][#2]{#3}{#4}{}{\VERCMDWarning{#1}{#2}{#3}}% }% #2 given }% #1 given } % \end{macrocode} % \end{macro} % % % \begin{macro}{\IfVerifyEnvironmentBegin} % \oarg{yourpackage} \oarg{theirpackage} % \marg{\cs{commandname}} % \marg{begin \MDfive\ checksum} % \changes{v1.10}{2024/06/25}{Added conditional tests.} % % Test the begin section of the environment. % \begin{macrocode} \NewDocumentCommand{\IfVerifyEnvironmentBegin}{O{} O{} m m}{% % \end{macrocode} % % Only if the package is enabled: % \begin{macrocode} \ifbool{VERCMDenable}{% % \end{macrocode} % % Default to an un-detected definition type: % \begin{macrocode} \edef\VERCMD@temp{Unknown~definition}% % \end{macrocode} % % Will become true if found \cs{NewDocumentCommand} or related. % \begin{macrocode} \boolfalse{VERCMD@this@ltxcmd} % \end{macrocode} % % For \cs{NewDocumentEnvironment}, the macro name is ``|\environment name code|'' with internal spaces. % \begin{macrocode} % % NewDocumentEnvironment: \ifcsdef{environment~#3~code}% {% \booltrue{VERCMD@this@ltxcmd}% \expandafter\VERCMD@mdfive% \csname environment~#3~code\endcsname% }% {% % \end{macrocode} % % For \cs{newenvironment} with an optional argument, % the macro name is ``|\\name|'', with two backslashes. % \begin{macrocode} % % newenvironment with option: \ifcsdef{\VERCMD@backslash#3}% {% \expandafter\VERCMD@mdfive% \csname \VERCMD@backslash#3\endcsname% }% {% % \end{macrocode} % % For \cs{newenvironment}, the macro name is ``|\name|''. % \begin{macrocode} % % newenvironment: \ifcsdef{#3}% {\expandafter\VERCMD@mdfive\csname #3\endcsname}% {}% }% }% % \end{macrocode} % % Do the first or second next argument depending on a match: % \changes{v1.10}{2024/08/28}{Added test groups.} % \begin{macrocode} \ifdefstring{\VERCMD@temp}{#4}% {% \booltrue{VERCMD@passed}% \let\VERCMD@tempa\@firstoftwo% }% {% \booltrue{VERCMD@failed}% \let\VERCMD@tempa\@secondoftwo% }% % \end{macrocode} % % \begin{macrocode} }% if package enabled {\let\VERCMD@tempa\@firstoftwo}% if package not enabled \VERCMD@tempa% } % \end{macrocode} % \end{macro} % % % \begin{macro}{\IfVerifyEnvironmentEnd} % \oarg{yourpackage} \oarg{theirpackage} % \marg{\cs{commandname}} % \marg{end \MDfive\ checksum} % \changes{v1.10}{2024/06/25}{Added conditional tests.} % % Test the end section of the environment. % \begin{macrocode} \NewDocumentCommand{\IfVerifyEnvironmentEnd}{O{} O{} m m}{% % \end{macrocode} % % Only if the package is enabled: % \begin{macrocode} \ifbool{VERCMDenable}{% % \end{macrocode} % % Default to an un-detected definition type: % \begin{macrocode} \edef\VERCMD@temp{Unknown~definition}% % \end{macrocode} % % Will become true if found \cs{NewDocumentCommand} or related. % \begin{macrocode} \boolfalse{VERCMD@this@ltxcmd} % \end{macrocode} % % For \cs{NewDocumentEnvironment}, the ending macro name % is ``|\environment name end aux |'', with spaces and a trailing space. % \begin{macrocode} % % end DocumentEnvironment: \ifcsdef{environment~#3~end~aux~}% {% \booltrue{VERCMD@this@ltxcmd}% \expandafter\VERCMD@mdfive \csname environment~#3~end~aux~\endcsname% }% {% % \end{macrocode} % % For \cs{newenvironment}, the ending macro name is ``|\endname|''. % \begin{macrocode} % % end newenvironment: \ifcsdef{end#3}% {% \expandafter\VERCMD@mdfive% \csname end#3\endcsname% }% {}% }% % \end{macrocode} % % Do the first or second next argument depending on a match: % \changes{v1.10}{2024/08/28}{Added test groups.} % \begin{macrocode} \ifdefstring{\VERCMD@temp}{#4}% {% \booltrue{VERCMD@passed}% \let\VERCMD@tempa\@firstoftwo% }% {% \booltrue{VERCMD@failed}% \let\VERCMD@tempa\@secondoftwo% }% }% if package enabled {\let\VERCMD@tempa\@firstoftwo}% if package not enabled \VERCMD@tempa% } % \end{macrocode} % \end{macro} % % % \begin{macro}{\VerifyEnvironment} \oarg{yourpackage} \oarg{theirpackage} % \marg{\cs{commandname}} % \marg{begin \MDfive\ checksum} % \marg{end \MDfive\ checksum} % % Test both the begin and end section of the environment. % \begin{macrocode} \NewDocumentCommand{\VerifyEnvironment}{O{} O{} m m m}{% % begin: \ifblank{#1}{% #1 blank \IfVerifyEnvironmentBegin{#3}{#4}% {}% {\VERCMDWarning{}{}{#3}}% }% #1 blank {% #1 given \ifblank{#2}{% #2 blank \IfVerifyEnvironmentBegin[#1]{#3}{#4}% {}% {\VERCMDWarning{#1}{}{#3}}% }% #2 blank {% #2 given \IfVerifyEnvironmentBegin[#1][#2]{#3}{#4}% {}% {\VERCMDWarning{#1}{#2}{#3}}% }% #2 given }% #1 given % end: \ifblank{#1}{% #1 blank \IfVerifyEnvironmentEnd{#3}{#5}% {}% {\VERCMDWarning{}{}{(end)#3}}% }% #1 blank {% #1 given \ifblank{#2}{% #2 blank \IfVerifyEnvironmentEnd[#1]{#3}{#5}% {}% {\VERCMDWarning{#1}{}{(end)#3}}% }% #2 blank {% #2 given \IfVerifyEnvironmentEnd[#1][#2]{#3}{#5}% {}% {\VERCMDWarning{#1}{#2}{(end)#3}}% }% #2 given }% #1 given } % \end{macrocode} % \end{macro} % % % \begin{macrocode} \ExplSyntaxOff % \end{macrocode} % % % \subsection{Verify infrastructure} % % \changes{v1.10}{2024/08/28}{Tests low-level \cs{NewDocumentCommand} code.} % % The low-level infrastructure for \cs{NewDocumentCommand} and related % may change on occasion, causing a change in the resulting code and % a verification error for such code. % The following is done while generating the documentation % for the \pkg{verifycommand} package, % and verifies the definitions of the underlying % infrastructure and issues a warning if any has changed. % % In the source for the following, \filenm{ltxcmd.dtx} uses |@@| which is % replaced by |__cmd|. % % (Testing silently occurs here, without adding text to the documentation.) % % \ExplSyntaxOn % % \TestVerifyCommands % % ^^A *checksums % \VerifyCommand[verifycommand][LaTeX kernel]{\__cmd_declare_cmd_code:Nnn} % {0911983C176452DDE1F471783F875529} % % \VerifyCommand[verifycommand][LaTeX kernel]{\__cmd_declare_cmd_optimized:Nnn} % {CC1FE1C2D4782317D9E9EB391AD7FFE4} % % \VerifyCommand[verifycommand][LaTeX kernel]{\__cmd_declare_cmd_code_aux:Nnn} % {6675F7AC09F310F6AB963DAA0860BD37} % % \VerifyCommand[verifycommand][LaTeX kernel]{\__cmd_declare_cmd_code_expandable:Nnn} % {8EDCF2A369B6F9CE43280D9118F01383} % \VerifyCommand[verifycommand][LaTeX kernel]{\__cmd_declare_env_internal:nnnn} % {7F026120EACC68911B492D09A4B0F537} % % \ExplSyntaxOff % % \IfVerifyCommandFailed % { % \AfterEndDocument{ % \PackageWarningNoLine{verifycommand}{% % The internals for LaTeX \string\NewCommand\MessageBreak% % and related have changed.\MessageBreak% % Update the checksums in verifycommand.dtx\MessageBreak % at `*checksums', and research when the\MessageBreak % internals changed and update the date\MessageBreak % in verifycommand.dtx at `*date'% % }% % } % } % {} % % % \clearpage % % \section{\pkg{verifycommand} package maintenance} % % To compile \filenm{verifycommand.sty} and \cs{verifycommand.pdf} % from \filenm{verifycommand.dtx} and \filenm{verifycommand.ins}: % % \begin{sourceverb} % pdflatex verifycommand.ins % pdflatex verifycommand.dtx % pdflatex verifycommand.dtx % makeindex -s gglo.ist -o verifycommand.gls verifycommand.glo % splitindex verifycommand.idx -- -s gind.ist % pdflatex verifycommand.dtx % pdflatex verifycommand.dtx % \end{sourceverb} % % % \iffalse % % \fi % % % % % % \clearpage % \pagestyle{plain} % % \renewcommand{\partname}{} % \renewcommand{\thepart}{} % ^^A \part{Change History and Index} % % % \Finale % \endinput