The last arg of \crossrefenum can now be a comma-delimited list

This commit is contained in:
Bastien Dumont
2025-08-05 12:48:06 +02:00
parent cbb190a907
commit 942371aef3

View File

@ -75,6 +75,13 @@
%%% Initialization: Programming macros %%% %%% Initialization: Programming macros %%%
% Trivial macros
\def\crfnm@appendToToks#1#2{#1=\expandafter{\the#1#2}}
\expandafter\def\expandafter\crfnm@gobspace\space{}
\def\crfnm@lettok#1#2{\let#1= #2}
\crfnm@lettok\crfnm@space{ }
% \crfnm@case is a standard case statement. % \crfnm@case is a standard case statement.
% #1 is the string or the purely expandable macro to be tested. % #1 is the string or the purely expandable macro to be tested.
% #2 is a sequence of tests of the form: % #2 is a sequence of tests of the form:
@ -605,7 +612,8 @@
{% {%
% Initializes the environment for this invocation, % Initializes the environment for this invocation,
% then passes the enumeration to the parsing % then passes the enumeration to the parsing
% and formatting macro \crfnm@formatEnum. % and formatting macro \crfnm@formatEnum
% through \crfnm@getAndProcessList.
\global\advance\crfnm@ienum by 1 \global\advance\crfnm@ienum by 1
% The reference type is capitalized so that it can be used % The reference type is capitalized so that it can be used
% to refer to macro names typed in camelCase % to refer to macro names typed in camelCase
@ -633,9 +641,10 @@
\edef\crfnm@printedRefsNb@previousPass{% \edef\crfnm@printedRefsNb@previousPass{%
\crfnm@getPrintedRefsNb@previousPass \crfnm@getPrintedRefsNb@previousPass
}% }%
% The following macro will process sequentially \edef\crfnm@thearg{#3}%
% all references in the enumeration. \ifx\crfnm@thearg\crfnm@empty\else
\expandafter\crfnm@formatEnum#3{crfnm@enumend}% \expandafter\crfnm@getAndProcessList\expandafter{\crfnm@thearg}%
\fi
}% }%
} }
@ -742,13 +751,57 @@
} }
\crfnm@endCases \crfnm@endCases
% If the last argument of \crossrefenum is a list of groups,
% pass it directly to \crfnm@formatEnum.
% Else, it is a comma-delimited list of strings (with optional leading spaces)
% to be transformed to a list of groups suitable for \crfnm@formatEnum.
\def\crfnm@getAndProcessList#1{%
\crfnm@getListDispatcher #1\crfnm@enumend
}
\def\crfnm@getListDispatcher{\futurelet\crfnm@nexttok\crfnm@getList@dispatcher}
\def\crfnm@getList@dispatcher{%
\ifx\crfnm@nexttok\bgroup
\expandafter\crfnm@formatEnum
\else
\expandafter\crfnm@commaListToGroups
\fi
}
\newtoks\crfnm@listAsGroups
\def\crfnm@commaListToGroups#1\crfnm@enumend{%
\crfnm@listAsGroups={}%
\crfnm@commaList@toGroups#1,\crfnm@end,%
}
\def\crfnm@commaList@toGroups#1,{%
\edef\crfnm@thearg{#1}%
\ifx\crfnm@thearg\crfnm@end
\def\crfnm@todo{%
\expandafter\crfnm@formatEnum\the\crfnm@listAsGroups\crfnm@enumend
}%
\else
\crfnm@appendToToks\crfnm@listAsGroups{{#1}}%
\def\crfnm@todo{\futurelet\crfnm@nexttok\crfnm@nextItemToGroup}%
\fi
\crfnm@todo
}
\def\crfnm@nextItemToGroup{%
\ifx\crfnm@nexttok\crfnm@space
\def\crfnm@todo{\expandafter\crfnm@commaList@toGroups\crfnm@gobspace}%
\else
\let\crfnm@todo\crfnm@commaList@toGroups
\fi
\crfnm@todo
}
%%% \crossrefenum: Processing the individual references in the enumeration %%% %%% \crossrefenum: Processing the individual references in the enumeration %%%
\def\crfnm@formatEnum#1{% \def\crfnm@formatEnum#1{%
% #1 is a string consisting of either: % #1 is a string consisting of either:
% * <label> % * <label>
% * <label1> to <label2> % * <label1> to <label2>
% * crfnm@enumend % * \crfnm@enumend
\crfnm@ifIsBeginOfEnum{% \crfnm@ifIsBeginOfEnum{%
\crfnm@setCurrentRef{#1}% \crfnm@setCurrentRef{#1}%
% We typeset the prefix at the beginning of the enumeration % We typeset the prefix at the beginning of the enumeration
@ -780,10 +833,10 @@
\def\crfnm@setCurrentRef#1{% \def\crfnm@setCurrentRef#1{%
\crfnm@ifIsDoubleRef{% \crfnm@ifIsDoubleRef{%
\def\crfnm@currentPrimary{#1}% \edef\crfnm@currentPrimary{#1}%
\def\crfnm@currentSecondary{#1}% \edef\crfnm@currentSecondary{#1}%
}{% }{%
\def\crfnm@current{#1}% \edef\crfnm@current{#1}%
}% }%
} }
@ -843,7 +896,7 @@
% Works in LaTeX because warnings are sent via \immediate\write. % Works in LaTeX because warnings are sent via \immediate\write.
% It should also work in ConTeXt because it writes the logs through % It should also work in ConTeXt because it writes the logs through
% a Lua call, not \write. % a Lua call, not \write.
\def\crfnm@tested{#1}% \edef\crfnm@tested{#1}%
\ifx\crfnm@tested\crfnm@enumend\else \ifx\crfnm@tested\crfnm@enumend\else
\setbox0=\hbox{\crfnm@simulateTypesetting{#1}}% \setbox0=\hbox{\crfnm@simulateTypesetting{#1}}%
\fi \fi
@ -878,11 +931,11 @@
\crfnm@ifIsDoubleRef{% \crfnm@ifIsDoubleRef{%
\let\crfnm@precedingPrimary\crfnm@currentPrimary \let\crfnm@precedingPrimary\crfnm@currentPrimary
\let\crfnm@precedingSecondary\crfnm@currentSecondary \let\crfnm@precedingSecondary\crfnm@currentSecondary
\def\crfnm@currentPrimary{#1}% \edef\crfnm@currentPrimary{#1}%
\def\crfnm@currentSecondary{#1}% \edef\crfnm@currentSecondary{#1}%
}{% }{%
\let\crfnm@preceding\crfnm@current \let\crfnm@preceding\crfnm@current
\def\crfnm@current{#1}% \edef\crfnm@current{#1}%
}% }%
} }