
LaTeX で次のことを実装するにはどうすればよいでしょうか。定義済みの変数 (プリアンブル内) を用意し、これを A と呼びます。
次に、次のようなコマンドを実行します。
\TwoTexts{Text1}{Text2}
これは次のように実行されます: A=1 の場合は Text1 が表示され、A=2 の場合は Text2 が表示されます。
何かアイデアはありますか? ありがとうございます!
答え1
\Amacro
以下は、マクロと という名前のカウンタの両方を含むバージョンです。必要にacntr
応じて を再定義する必要がないため、個人的にはカウンタ バージョンの方が好きです。\Amacro
またはそれ以外の場合のテストは1
次のように行われます。\ifnum...\fi
ここでは、 以外の値は1
に分岐すると想定しましたText2
。
\documentclass{article}
\newcommand{\Amacro}{1}
\newcommand{\TwoTexts}[2]{%
\ifnum\Amacro=1\relax%
#1%
\else
#2%
\fi
}
\newcounter{acntr}
\newcommand{\TwoTextsImproved}[2]{%
\ifnum\value{acntr}=1\relax
#1%
\else
#2%
\fi
}
\begin{document}
\setcounter{acntr}{1}
\TwoTexts{You should see this}{Nope, not this}
\renewcommand{\Amacro}{2}
\TwoTexts{You should see this}{Nope, this is it}
\TwoTextsImproved{You should see this}{Nope, not this}
\stepcounter{acntr}
\TwoTextsImproved{You should see this}{Nope, this is it}
\end{document}
答え2
\if..
不均衡な問題を防ぐために、\else
私は次\fi
のようにします:\Firstoftwo
\Secondoftwo
\documentclass{article}
\newcommand\Firstoftwo[2]{#1}%
\newcommand\Secondoftwo[2]{#2}%
\newcommand\Amacro{1}%
\newcommand\setAmacro[1]{\renewcommand\Amacro{#1}}%
\newcommand{\TwoTexts}{%
\ifnum\Amacro>1 %
\expandafter\Secondoftwo
\else
\expandafter\Firstoftwo
\fi
}
\begin{document}
\setAmacro{-3}
\texttt{\string\Amacro} is \Amacro.\\
\TwoTexts{Text in case the value in \texttt{\string\Amacro} is smaller than 1 or equal to 1}%
{Text in case the value in \texttt{\string\Amacro} is larger than 1}%
\setAmacro{0}
\texttt{\string\Amacro} is \Amacro.\\
\TwoTexts{Text in case the value in \texttt{\string\Amacro} is smaller than 1 or equal to 1}%
{Text in case the value in \texttt{\string\Amacro} is larger than 1}%
\setAmacro{1}
\texttt{\string\Amacro} is \Amacro.\\
\TwoTexts{Text in case the value in \texttt{\string\Amacro} is smaller than 1 or equal to 1}%
{Text in case the value in \texttt{\string\Amacro} is larger than 1}%
\setAmacro{2}
\texttt{\string\Amacro} is \Amacro.\\
\TwoTexts{Text in case the value in \texttt{\string\Amacro} is smaller than 1 or equal to 1}%
{Text in case the value in \texttt{\string\Amacro} is larger than 1}%
\setAmacro{17}
\texttt{\string\Amacro} is \Amacro.\\
\TwoTexts{Text in case the value in \texttt{\string\Amacro} is smaller than 1 or equal to 1}%
{Text in case the value in \texttt{\string\Amacro} is larger than 1}%
\end{document}
ちなみに、数年前に、\UD@KeepKthOfLArguments
任意の数の無制限の引数から任意の無制限の引数を選択できるルーチンを作成しました。このルーチンは、再帰により、TeX のマクロ プログラミングに通常課せられる 9 個の引数制限に縛られません。
このルーチンを使用して、変数/プレースホルダー/マクロ/レジスタなど\choosetext
に保持されている数値に応じて、テキスト フレーズを保持する区切りのない引数を選択する別のルーチンを作成できます。\count
\documentclass{article}
\makeatletter
%%=========================================================================
%% Paraphernalia:
%% \UD@firstoftwo, \UD@secondoftwo, \UD@PassFirstToSecond
%%.........................................................................
\newcommand\UD@firstoftwo[2]{#1}%
\newcommand\UD@secondoftwo[2]{#2}%
\newcommand\UD@PassFirstToSecond[2]{#2{#1}}%
%%-------------------------------------------------------------------------
%% Check whether argument is empty:
%%.........................................................................
%% \UD@CheckWhetherNull{<Argument which is to be checked>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is empty>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is not empty>}%
%%
%% The gist of this macro comes from Robert R. Schneck's \ifempty-macro:
%% <https://groups.google.com/forum/#!original/comp.text.tex/kuOEIQIrElc/lUg37FmhA74J>
%%
%% A concern in his posting is that the argument is hit with \string
%% after some expansions which in edge cases might result in unbalancing
%% surrounding \if..\fi-constructs if the macro is used inside of such
%% \if..\fi-constructs.
%%
%% That challenging concern sickened me. ;-)
%%
%% Therefore I decided to implerment a variant where this cannot happen
%% as expansion is forced by \romannumeral:
%%
%% After the first expansion-step, \string is not applied yet.
%% After the second expansion-step, any possibly disturbing remainders
%% are already removed due to \romannumeral-expansion.
%%
%% No eTeX- or whatsoever extensions. No \if.. .Only \romannumeral,
%% digit 0, space token for terminating \romannumeral-expansion,
%% \string, \expandafter, \UD@firstoftwo, \UD@secondoftwo, {, }.
%%
%% May 20, 2016
%%
%% Ulrich Diez (e-mail: [email protected])
%%
\newcommand\UD@CheckWhetherNull[1]{%
\romannumeral0\expandafter\UD@secondoftwo\string{\expandafter
\UD@secondoftwo\expandafter{\expandafter{\string#1}\expandafter
\UD@secondoftwo\string}\expandafter\UD@firstoftwo\expandafter{\expandafter
\UD@secondoftwo\string}\expandafter\expandafter\UD@firstoftwo{ }{}%
\UD@secondoftwo}{\expandafter\expandafter\UD@firstoftwo{ }{}\UD@firstoftwo}%
}%
%%-------------------------------------------------------------------------
%% Keep only the K-th of L consecutive undelimited arguments.
%% ( IF K < 1 OR K > L just remove L consecutive undelimited arguments. )
%%.........................................................................
%% \UD@KeepKthOfLArguments{<integer number K>}%
%% {<integer number L>}%
%% {<Tokens to insert before K-th argument>}%
%% <L consecutive undelimited arguments>
%%
%% If K >= 1 and K <= L yields:
%% <Tokens to insert before K-th argument><K-th undelimited argument>
%% If K < 1 or K > L
%% (-> there is no K-th argument in the set
%% of <L consecutive undelimited arguments> )
%% yields:
%% <Tokens to insert before K-th argument>
%%
%% Examples:
%%
%% X\UD@KeepKthOfLArguments{3}{7}{<Tokens to insert>}{A}{B}{C}{D}{E}{F}{G}X
%% yields: X<Tokens to insert>CX
%%
%% X\UD@KeepKthOfLArguments{5}{2}{<Tokens to insert>}{A}{B}X
%% yields X<Tokens to insert>X
%%
%% X\UD@KeepKthOfLArguments{0}{2}{<Tokens to insert>}{A}{B}X
%% yields X<Tokens to insert>X
%%
%% X\romannumeral0%
%% \UD@KeepKthOfLArguments{3}{7}{ <Tokens to insert>}{A}{B}{C}{D}{E}{F}{G}X
%% yields: X\romannumeral0 <Tokens to insert>CX
%% yields: X<Tokens to insert>CX
%% In case of embedding the whole thing in other expansion-contexts,
%% you need to have "hit" \romannumeral by only one \expandafter-chain for
%% obtaining the result...
%%
%% January 17, 2005
%%
%% Ulrich Diez (e-mail: [email protected])
%%
\newcommand\UD@KeepKthOfLArguments[2]{%
\expandafter\UD@KeepKthOfLArgumentsA
\expandafter{\romannumeral\number\number#1 000\expandafter}%
\expandafter{\romannumeral\number\number#2 000}%
}%
\newcommand\UD@KeepKthOfLArgumentsA[3]{%
\UD@CheckWhetherNull{#1}{%
\UD@RemoveNArguments{#2}{#3}{}%
}{%
\expandafter\UD@PassFirstToSecond
\expandafter{%
\UD@firstoftwo{}#1}{\UD@KeepKthOfLArgumentsB{#1}{#2}}{#2}{#3}%
}%
}%
\newcommand\UD@KeepKthOfLArgumentsB[5]{%
\UD@CheckWhetherNull{#1}{%
\UD@RemoveNArguments{#3}{\UD@RemoveNArguments{#2}{#5}}{}%
}{%
\UD@CheckWhetherNull{#2}{%
\UD@RemoveNArguments{#4}{#5}{}%
}{%
\expandafter\UD@PassFirstToSecond
\expandafter{%
\UD@firstoftwo{}#2}{\expandafter\UD@KeepKthOfLArgumentsB
\expandafter{%
\UD@firstoftwo{}#1}}{#3}{#4}{#5}%
}%
}%
}%
\newcommand\UD@RemoveNArguments[3]{%
\UD@CheckWhetherNull{#1}{#2#3}{%
\UD@firstoftwo{%
\expandafter\UD@RemoveNArguments
\expandafter{\UD@firstoftwo{}#1}{#2}{#3}%
}%
}%
}%
%%-------------------------------------------------------------------------
%% A demo-routine:
%%
%% \choosetext{<number>}%
%% {<Text in case number < 1>}%
%% {<Text in case number = 1>}%
%% {<Text in case number = 2>}%
%% {<Text in case number = 3>}%
%% {<Text in case number = 4>}%
%% {<Text in case number = 5>}%
%% {<Text in case number = 6>}%
%% {<Text in case number = 7>}%
%% {<Text in case number = 8>}%
%% {<Text in case number = 9>}%
%% {<Text in case number = 10>}%
%% {<Text in case number = 11>}%
%% {<Text in case number = 12>}%
%% {<Text in case number = 13>}%
%% {<Text in case number = 14>}%
%% {<Text in case number > 14>}%
%%
%% The <number>-argument can hold anything that _expands_ to the components
%% of a quantity that is subsumable under the term <number> which is
%% explained in Donald E. Knuth's The TeXbook, Chapter 24: Summary of
%% Vertical Mode.
%%
%% Therefore <number> can as well be a macro-token expanding to a digit-
%% sequence, or a \the-call to a \count-register.
%%
%% January 24, 2017
%%
%% Ulrich Diez (e-mail: [email protected])
%%
%%.........................................................................
\newcommand\choosetext[1]{%
\romannumeral0%
\UD@KeepKthOfLArguments{\ifcase\expandafter\UD@firstoftwo
\expandafter{\number\ifnum#1<1 0\else#1\fi}{} %
1\or2\or3\or4\or5\or6\or7\or8\or
9\or10\or11\or12\or13\or14\or15\else16\fi}%
{16}%
{ }%
}%
%%-------------------------------------------------------------------------
%% A "variable" \Amacro and the routine \setAmacro for setting it's value.
%%.........................................................................
\newcommand\Amacro{1}%
\newcommand\setAmacro[1]{\renewcommand\Amacro{#1}}%
\makeatother
\begin{document}
The \verb|<number>|-argument of \verb|\choosetext| can hold anything that
expands to the components of a quantity that is subsumable under the term
\verb|<number>| which is explained in Donald E. Knuth's The TeXbook,
Chapter 24: Summary of Vertical Mode.
\bigskip
Thus the \verb|<number>|-argument of \verb|\choosetext| can hold a sequence
of digits, e.g., the digit \verb|5|:
\bigskip
\choosetext{5}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\bigskip
The \verb|<number>|-argument of \verb|\choosetext| can as well hold a
macro-token which serves as variable/placeholder for numerical values.
\bigskip
\setAmacro{17}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{15}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{14}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{13}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{12}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{11}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{10}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{9}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{8}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{7}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{6}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{5}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{4}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{3}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{2}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{1}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{0}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{-1}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\end{document}
答え3
A
あなたの"変数") は定数なので、\TwoTexts
次のように定義できます。
\newcommand\TwoTexts[2]{#1} % case A = 1
% \newcommand\TwoTexts[2]{#2} % case A = 2
の値を選択するにはA
、正しい行のコメントを解除します。
答え4
私はちょうど私の\choosetext
ルーチンを強化しましたhttps://tex.stackexchange.com/a/350169/118714. これで、変数番号の範囲の下限と上限を指定できます。Heiko Oberdiek の bigintcalc パッケージを使用すると、ルーチンは処理される区切りのない引数の数を計算し、正しい引数を自動的に選択します。
\documentclass{article}
\usepackage{bigintcalc}
\makeatletter
%%=========================================================================
%% Paraphernalia:
%% \UD@firstoftwo, \UD@secondoftwo, \UD@PassFirstToSecond
%%.........................................................................
\newcommand\UD@firstoftwo[2]{#1}%
\newcommand\UD@secondoftwo[2]{#2}%
\newcommand\UD@PassFirstToSecond[2]{#2{#1}}%
%%-------------------------------------------------------------------------
%% Check whether argument is empty:
%%.........................................................................
%% \UD@CheckWhetherNull{<Argument which is to be checked>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is empty>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is not empty>}%
%%
%% The gist of this macro comes from Robert R. Schneck's \ifempty-macro:
%% <https://groups.google.com/forum/#!original/comp.text.tex/kuOEIQIrElc/lUg37FmhA74J>
%%
%% A concern in his posting is that the argument is hit with \string
%% after some expansions which in edge cases might result in unbalancing
%% surrounding \if..\fi-constructs if the macro is used inside of such
%% \if..\fi-constructs.
%%
%% That challenging concern sickened me. ;-)
%%
%% Therefore I decided to implerment a variant where this cannot happen
%% as expansion is forced by \romannumeral:
%%
%% After the first expansion-step, \string is not applied yet.
%% After the second expansion-step, any possibly disturbing remainders
%% are already removed due to \romannumeral-expansion.
%%
%% No eTeX- or whatsoever extensions. No \if.. .Only \romannumeral,
%% digit 0, space token for terminating \romannumeral-expansion,
%% \string, \expandafter, \UD@firstoftwo, \UD@secondoftwo, {, }.
%%
%% May 20, 2016
%%
%% Ulrich Diez (e-mail: [email protected])
%%
\newcommand\UD@CheckWhetherNull[1]{%
\romannumeral0\expandafter\UD@secondoftwo\string{\expandafter
\UD@secondoftwo\expandafter{\expandafter{\string#1}\expandafter
\UD@secondoftwo\string}\expandafter\UD@firstoftwo\expandafter{\expandafter
\UD@secondoftwo\string}\expandafter\expandafter\UD@firstoftwo{ }{}%
\UD@secondoftwo}{\expandafter\expandafter\UD@firstoftwo{ }{}\UD@firstoftwo}%
}%
%%-------------------------------------------------------------------------
%% Keep only the K-th of L consecutive undelimited arguments.
%% ( IF K < 1 OR K > L just remove L consecutive undelimited arguments. )
%%.........................................................................
%% \UD@KeepKthOfLArguments{<integer number K>}%
%% {<integer number L>}%
%% {<Tokens to insert before K-th argument>}%
%% <L consecutive undelimited arguments>
%%
%% If K >= 1 and K <= L yields:
%% <Tokens to insert before K-th argument><K-th undelimited argument>
%% If K < 1 or K > L
%% (-> there is no K-th argument in the set
%% of <L consecutive undelimited arguments> )
%% yields:
%% <Tokens to insert before K-th argument>
%%
%% Examples:
%%
%% X\UD@KeepKthOfLArguments{3}{7}{<Tokens to insert>}{A}{B}{C}{D}{E}{F}{G}X
%% yields: X<Tokens to insert>CX
%%
%% X\UD@KeepKthOfLArguments{5}{2}{<Tokens to insert>}{A}{B}X
%% yields X<Tokens to insert>X
%%
%% X\UD@KeepKthOfLArguments{0}{2}{<Tokens to insert>}{A}{B}X
%% yields X<Tokens to insert>X
%%
%% X\romannumeral0%
%% \UD@KeepKthOfLArguments{3}{7}{ <Tokens to insert>}{A}{B}{C}{D}{E}{F}{G}X
%% yields: X\romannumeral0 <Tokens to insert>CX
%% yields: X<Tokens to insert>CX
%% In case of embedding the whole thing in other expansion-contexts,
%% you need to have "hit" \romannumeral by only one \expandafter-chain for
%% obtaining the result...
%%
%% January 17, 2005
%%
%% Ulrich Diez (e-mail: [email protected])
%%
\newcommand\UD@KeepKthOfLArguments[2]{%
\expandafter\UD@KeepKthOfLArgumentsA
\expandafter{\romannumeral\number\number#1 000\expandafter}%
\expandafter{\romannumeral\number\number#2 000}%
}%
\newcommand\UD@KeepKthOfLArgumentsA[3]{%
\UD@CheckWhetherNull{#1}{%
\UD@RemoveNArguments{#2}{#3}{}%
}{%
\expandafter\UD@PassFirstToSecond
\expandafter{%
\UD@firstoftwo{}#1}{\UD@KeepKthOfLArgumentsB{#1}{#2}}{#2}{#3}%
}%
}%
\newcommand\UD@KeepKthOfLArgumentsB[5]{%
\UD@CheckWhetherNull{#1}{%
\UD@RemoveNArguments{#3}{\UD@RemoveNArguments{#2}{#5}}{}%
}{%
\UD@CheckWhetherNull{#2}{%
\UD@RemoveNArguments{#4}{#5}{}%
}{%
\expandafter\UD@PassFirstToSecond
\expandafter{%
\UD@firstoftwo{}#2}{\expandafter\UD@KeepKthOfLArgumentsB
\expandafter{%
\UD@firstoftwo{}#1}}{#3}{#4}{#5}%
}%
}%
}%
\newcommand\UD@RemoveNArguments[3]{%
\UD@CheckWhetherNull{#1}{#2#3}{%
\UD@firstoftwo{%
\expandafter\UD@RemoveNArguments
\expandafter{\UD@firstoftwo{}#1}{#2}{#3}%
}%
}%
}%
%%-------------------------------------------------------------------------
%% \UD@incrementloop{<lower bound>}%
%% {<upper bound>}%
%% {<count start>}%
%% {<tokens to prepend in front of each number except last number>}%
%% {<tokens to prepend in front of last number>}%
%% {<tokens to prepend at the begnning>}%
%% {<tokens to append at the end>}%
%%
%% Examples:
%% \UD@incrementloop{3}{7}{2}{<Before All>}{<Before Number>}{<Before Last Number>}{<After Last Numbe>r}
%%
%% -> The range 3..7 contains 7-3+1 consecutive integeral numbers/elements
%% = 5 consecutive integeral numbers/elements.
%% -> Gathering 5 consecutive integeral numbers/elements starting with
%% number/element 2 yields the numbers/elements 2,3,4,5,6.
%% (You can gather them by iteratively decrementing from 7-3=4 until
%% reaching -1 while within each iteration before reaching -1
%% "spitting out" a value and incrementing that value, starting
%% with value=2.)
%%
%% -> <Before All><Before Number>2<Before Number>3<Before Number>4<Before Number>5<Before Last Number>6<After Last Number>
%%
%% ,i.e., with
%% <Before All>=\ifcase[<number>] 1} and
%% <Before Number>=\or and
%% <Before Last Number>=\else and
%% <After Last Number>=\fi
%% yields:
%%
%% \UD@incrementloop{3}{7}{2}{\ifcase[<number>] 1}{\or}{\else}{\fi}
%% ->
%% \ifcase[<number>] 1\or2\or3\or4\or5\else6\fi
%%
\newcommand\UD@incrementloop[3]{%
\romannumeral0%
\expandafter\UD@PassFirstToSecond
\expandafter{\number#3}{%
\expandafter\expandafter\expandafter\UD@PassFirstToSecond
\expandafter\expandafter\expandafter{\bigintcalcSub{\number#2}{\number#1}}%
{\UD@@incrementloop}{}%
}%
}%
\newcommand\UD@@incrementloop[7]{%
\ifnum\bigintcalcCmp{0}{#1}=-1 %
\expandafter\UD@secondoftwo
\else
\expandafter\UD@firstoftwo
\fi
{%
\ifnum\bigintcalcCmp{0}{#1}=1 %
\expandafter\UD@secondoftwo
\else
\expandafter\UD@firstoftwo
\fi
{ #4#2#6#3#7}%
{ #4#2#7}%
}{%
\expandafter\expandafter\expandafter\UD@PassFirstToSecond
\expandafter\expandafter\expandafter{\bigintcalcInc{#3}}%
{\expandafter\expandafter\expandafter\UD@@incrementloop
\expandafter\expandafter\expandafter{\bigintcalcDec{#1}}%
{#2#5#3}}{#4}{#5}{#6}{#7}%
}%
}%
%%-------------------------------------------------------------------------
%% A demo-routine:
%%
%% \choosetext{<number from variable>}%
%% {<number denoting lower bound>}%
%% {<number denoting upper bound>}%
%% {<Text in case <number from variable> is smaller than <number denoting lower bound> >}%
%% {<Text in case <number from variable> = <number denoting lower bound> >}%
%% {<Text in case <number from variable> = <number denoting lower bound>+1 >}%
%% {<Text in case <number from variable> = <number denoting lower bound>+2 >}%
%% ...
%% {<Text in case <number from variable> = <number denoting lower bound>+K >
%% ...
%% {<Text in case <number from variable> = <number denoting upper bound>-2 >}%
%% {<Text in case <number from variable> = <number denoting upper bound>-1 >}%
%% {<Text in case <number from variable> = <number denoting upper bound> >}%
%% {<Text in case <number from variable> is larger than <number denoting upper bound> >}%
%%
%% The <number...>-arguments can hold anything that _expands_ to the components
%% of a quantity that is subsumable under the term <number> which is
%% explained in Donald E. Knuth's The TeXbook, Chapter 24: Summary of
%% Vertical Mode.
%%
%% Therefore the <number...>-arguments can as well be a macro-tokens expanding
%% to a digit-sequences, or \the-calls to \count-registers.
%%
%% Due to \romannumeral-expansion the result is delivered within two
%% expansion-steps.
%%
%% January 24, 2017
%%
%% Ulrich Diez (e-mail: [email protected])
%%
%%.........................................................................
\newcommand\choosetext[3]{%
\romannumeral0%
\UD@KeepKthOfLArguments{%
\UD@incrementloop{2}%
{\bigintcalcAdd{\bigintcalcSub{\number#3}{\number#2}}{3}}%
{2}%
{%
\ifcase\expandafter\UD@firstoftwo\expandafter{%
\number
\ifnum\bigintcalcCmp{%
\bigintcalcSub{\number#1}{\number#2}%
}{0}<0 %
\expandafter\UD@firstoftwo
\else
\expandafter\UD@secondoftwo
\fi
{0}{%
\bigintcalcAdd
{\bigintcalcSub{\number#1}{\number#2}}%
{1}%
}%
}{} 1%
}%
{\or}%
{\else}%
{\fi}%
}{%
\bigintcalcAdd{\bigintcalcSub{\number#3}{\number#2}}{3}%
}{ }%
}%
%%-------------------------------------------------------------------------
%% A "variable" \Amacro and the routine \setAmacro for setting it's value.
%%.........................................................................
\newcommand\Amacro{1}%
\newcommand\setAmacro[1]{\renewcommand\Amacro{#1}}%
\makeatother
\begin{document}
The \verb|<number>|-argument of \verb|\choosetext| can hold anything that
expands to the components of a quantity that is subsumable under the term
\verb|<number>| which is explained in Donald E. Knuth's The TeXbook,
Chapter 24: Summary of Vertical Mode.
\bigskip
Thus the \verb|<number>|-argument of \verb|\choosetext| can hold a sequence
of digits, e.g., the digit \verb|5|:
\bigskip
\choosetext{5}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\bigskip
The \verb|<number>|-argument of \verb|\choosetext| can as well hold a
macro-token which serves as variable/placeholder for numerical values.
\bigskip
\setAmacro{9}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{7}{12}%
{Text in case number is smaller than 7}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is larger than 12}%
\hrulefill
\setAmacro{9}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{4}{8}%
{Text in case number is smaller than 4}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is larger than 8}%
\hrulefill
\setAmacro{17}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{14}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{13}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{12}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{11}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{10}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{9}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{8}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{7}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{6}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{5}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{4}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{3}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{2}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{1}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{0}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\hrulefill
\setAmacro{-1}%
\verb|\Amacro| expands to the number \Amacro:
\choosetext{\Amacro}{1}{14}%
{Text in case number is smaller than 1}%
{Text in case number is 1}%
{Text in case number is 2}%
{Text in case number is 3}%
{Text in case number is 4}%
{Text in case number is 5}%
{Text in case number is 6}%
{Text in case number is 7}%
{Text in case number is 8}%
{Text in case number is 9}%
{Text in case number is 10}%
{Text in case number is 11}%
{Text in case number is 12}%
{Text in case number is 13}%
{Text in case number is 14}%
{Text in case number is larger than 14}%
\end{document}