如何比较 \newenvironment 参数中的数字

如何比较 \newenvironment 参数中的数字

我正在尝试创建一个新的环境,如下所示

\newenvironment{letters}[1]{%
    \vspace{-3mm}
    \ifnum #1=1%
    \else
        \begin{multicols}{#1}
    \fi
    \begin{enumerate}[label=\textbf{(\alph*)}]
    }{%
    \end{enumerate}
    \ifnum #1=1%
    \else
        \end{multicols}
    \fi
    \vspace{-5mm}
    }

我的问题是:為什麼它不起作用?!

注意:这不是重复的这个帖子,因为我不想做\RenewDocumentEnvironment。相反,我想创建一个新的环境。

答案1

如果你看一下日志,你会发现 TeX 抱怨的第一件事是:

! Illegal parameter number in definition of \endletters.
<to be read again> 
                   1
l.22     }

#1这是因为您尝试在环境的一部分中使用\end,但是不能在环境的一部分\begin中使用传递给该部分的参数。\end

如果你要这样做,那么环境的使用就必须是这样的:

\begin{letters}{1}
  \item stuff
\end{letters}{1}

将参数传递给\end{letters}

要实现您想要的功能,您需要设计另一种方式将信息传递给该\end部件。例如,使用\newif

\documentclass{article}
\usepackage{enumitem}
\usepackage{multicol}

\newif\ifLettersMulticol
\newenvironment{letters}[1]{%
  \vspace{-3mm}
  \ifnum #1=1
  \else
    \LettersMulticoltrue
    \begin{multicols}{#1}
  \fi
  \begin{enumerate}[label=\textbf{(\alph*)}]
}{%
  \end{enumerate}
  \ifLettersMulticol
    \end{multicols}
  \fi
  \vspace{-5mm}
}

\begin{document}

\begin{letters}{1}
\item  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
\item  tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
\item  quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
\item  consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
\item  cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
\item  proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\end{letters}

\begin{letters}{2}
\item  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
\item  tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
\item  quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
\item  consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
\item  cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
\item  proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\end{letters}

\end{document}

此外,正如评论中指出的那样,在测试中(以及其他几种情况)%在行尾添加一个并不是一个好主意。当 TeX 扫描测试中的数字时,它会扩展标记,并将继续这样做,直到找到不是数字的东西。例如,以下(可能很愚蠢,但可以作为演示)代码\ifnum\ifnum

\ifnum1=0%
  \ifnum2=2
    1%
  \else
    2%
  \fi
  a%
\else
  b%
\fi

生成的是a,而不是b,就像快速浏览过 的人\ifnum1=0会猜到的那样。但是,如果删除第一个%,则输出为b

%此外,测试末尾的缺失\ifnum#1=1不会出现在输出中,因为 TeX 的数字扫描机制规定数字后面可以跟可选空格,所以这个是安全的。当然,为了确保万无一失,可以使用\ifnum: 结束测试\relax扫描\ifnum#1=1\relax

在这种特殊情况下,虽然%不会造成麻烦,但还是谨慎一点为好。

相关内容