我为罗马和阿拉伯计数器创建了两个 tex 命令。可选参数设置第一个数字。
如果我删除另一个命令,则两个命令均有效。但如果同时使用,罗马命令也会返回阿拉伯结果。
任何调试方面的帮助都将不胜感激。以下是 MWE:
\documentclass{letter}
\setlength\parindent{0pt}
%% command \idt.
%% usage \idt[1] gives (i), then \idt gives (ii), (iii), (iv)...
\newcounter{idtc} \setcounter{idtc}{0}
\makeatletter
\def\idt{\@ifnextchar[{\@first}{\@next}}
\def\@first[#1]{\setcounter{idtc}{#1}{\it \bfseries{(\roman{idtc})} \ }}
\def\@next{\stepcounter{idtc}{\it \bfseries{(\roman{idtc})} \ }}
\makeatother
%% command \udt.
%% usage \udt[1] gives (1), then \udt gives (2), (3), (4)...
\newcounter{udtc} \setcounter{udtc}{0}
\makeatletter
\def\udt{\@ifnextchar[{\@first}{\@next}}
\def\@first[#1]{\setcounter{udtc}{#1}{\it \bfseries{(\arabic{udtc})} \ }}
\def\@next{\stepcounter{udtc}{\it \bfseries{(\arabic{udtc})} \ }}
\makeatother
\begin{document}
Résultat avec $\backslash idt$: \\
\idt[1] Should be {\it \bfseries{(i)}}.\\
\idt Should be {\it \bfseries{(ii)}}.\\ \\
Résultat avec $\backslash udt$: \\
\udt[1] Is correct.\\
\udt Is correct.\\
\end{document}
答案1
目前尚不清楚为什么使用低级别\def
而不是\newcommand
可以使用可选参数定义命令。
但
\def\idt{\@ifnextchar[{\@first}{\@next}}
意味着如果你不使用,\[
则命令\@next
将运行。你\@next
使用两次定义\def
,因此第一个定义被丢弃,并定义为
\def\@next{\stepcounter{udtc}{\it \bfseries{(\arabic{udtc})} \ }}
并产生阿拉伯语。
注意\\
示例中的所有生成
Underfull \hbox (badness 10000) in paragraph at lines 29--30
这是 TeX 为其输出指定的最高不良程度。
\documentclass{letter}
\usepackage{parskip}
\usepackage[T1]{fontenc}
%% command \idt.
%% usage \idt[1] gives (i), then \idt gives (ii), (iii), (iv)...
\newcounter{idtc}
\newcounter{udtc}
\newcommand\idt[1][\relax]{%
\ifx\relax#1\stepcounter{idtc}\else\setcounter{idtc}{#1}\fi
{\itshape \bfseries{(\roman{idtc})} | }\ignorespaces}
\newcommand\udt[1][\relax]{%
\ifx\relax#1\stepcounter{udtc}\else\setcounter{udtc}{#1}\fi
{\itshape \bfseries{(\arabic{udtc})} | }\ignorespaces}
\begin{document}
Résultat avec $\backslash idt$:
\idt[1] Should be {\itshape \bfseries{(i)}}.
\idt Should be {\itshape \bfseries{(ii)}}.
Résultat avec $\backslash udt$:
\udt[1] Is correct.
\udt Is correct.
\end{document}
答案2
非常老式的编程风格……
这是一个更现代的实现,其中为类似的命令定义了一个包装器,然后根据它定义了两个主要命令。
\documentclass{article}
%\usepackage{xparse} % uncomment if using a LaTeX release prior to 2020-10-01
\newcounter{idtc}
\newcounter{udtc}
\NewDocumentCommand{\dtgeneric}{mmo}{%
% #1 = counter name
% #2 = counter representation
% #3 = optional value to set the counter to
% set the counter (if optional argument is present) or step it
\IfValueTF{#3}{\setcounter{#1}{#3}}{\stepcounter{#1}}%
\textbf{\textit{(#2{#1})}} \ \ignorespaces
}
\NewDocumentCommand{\idt}{}{\dtgeneric{idtc}{\roman}}
\NewDocumentCommand{\udt}{}{\dtgeneric{udtc}{\arabic}}
\begin{document}
Résultat avec \verb|\idt|
\idt[1] Should be {\itshape\bfseries{(i)}}.
\idt Should be {\itshape\bfseries{(ii)}}.
Résultat avec \verb|\udt|:
\udt[1] Is correct.
\udt Is correct.
\end{document}