斜体和罗马字体并排

斜体和罗马字体并排

我为罗马和阿拉伯计数器创建了两个 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}

在此处输入图片描述

相关内容