我正在尝试编辑我在自己创建的环境中使用的 if 语句。之前,代码是
\if #1\empty
\else
\textbf{#1.}\hspace{0.5em}%
\fi
我想把它改成类似
\if #1\empty \textbf{}\hspace{0.5em}
\else
\textbf{#1.}\hspace{0.5em}%
\fi
我可以将我想要的内容放入 \textbf{} 中。但无论我在其中放入什么,都会在它前面打印 \Omega。当像上面一样留空时,它只会打印 \Omega。如果 #1 不为空,则没有 \Omega。
我的代码
\documentclass[12pt,letterpaper]{article}
\newenvironment{question}[3][]{
\noindent\ignorespaces
\if #1\empty \textbf{}\hspace{0.5em}
\else
\textbf{#1.}\hspace{0.5em}%
\fi
}{}
\begin{document}
\begin{question}{0}{8}\end{question}
\begin{question}[1]{0}{8}\end{question}
\end{document}
任何关于摆脱这个资本欧米茄的建议都非常受欢迎。
答案1
\if
扩展以下标记,直到找到两个可扩展标记。如果#1
为空,则\empty
扩展为无,然后\textbf
,它会找到这些标记。扩展:
\empty ->
\empty
消失,因为其定义文本是空的。
\textbf -> \protect \textbf␣
在该上下文中,\protect
具有 的含义\relax
,因此它是第一个不可扩展的标记。
\textbf␣ #1 -> \ifmmode ...\else \hmode@bgroup ... \fi
我们没有数学模式,因此\hmode@bgroup
扩展了:
\hmode@bgroup -> \leavevmode \bgroup
\leavevmode -> \unhbox \voidb@x
现在我们第二个不可扩展的标记是。因为两个标记都是命令标记,所以 的\unhbox
结果为 ,其余标记不会被删除。被执行,现在作为独立标记,而不是 的参数。它是一个字符常量,用于编码框号,旨在与 一起使用。\if
true
\voidb@x
\unhbox
\unhbox
\voidb@x
是数字 65,定义为\char"A
。在当前字体中,这表示大写 omega。
#1
如果以两个相等的不可扩展标记开头,则测试也会失败,例如11
。
下面的示例放入#1
宏并通过与\QuestionFirstParam
进行比较,因为不扩展以下标记,而是比较接下来的两个标记:\ifx
\empty
\ifx
\documentclass[12pt,letterpaper]{article}
\newenvironment{question}[3][]{%
\noindent
\def\QuestionFirstParam{#1}%
\ifx\QuestionFirstParam\empty
\leavevmode
% \textbf{}%
% \hspace{0.5em}%
\else
\textbf{#1.}\hspace{0.5em}%
\fi
arg2 = #2, arg3 = #3%
}{}
\begin{document}
\begin{question}{0}{8}\end{question}
\begin{question}[1]{0}{8}\end{question}
\end{document}