我正在尝试编写一个小型 Latex 包来了解有关 Tex 的更多信息,并通过创建宏来从给定规则编号(在任意概要中给出)的表中检索规则名称,从而帮助我为课程编写冗长而烦人的证明。
但是我在从宏内部调用宏时遇到了严重的问题。
这是我的代码:
%macro for formatting rules
\newcommand{\nR}[1]{%
=\;\{\text{{#1}}\}%
}
%Prints the rule specified by the argument from the nametable in a nice formatting
\newcommand{\Rnl}[1]{%
&\\&\nR{\nT{{#1}}}\\&%
}
%rule nametable
\newcommand{\nT}[1]{%
\stringcases
{#1}%
{%
{1.1}{Axiom of whatever}%
{2.1}{Silly theorem}%
}%
{\mathbf{UNDEFINED\_RULE\;\;{#1}}}%
}
%I got these from:
% http://tex.stackexchange.com/questions/64131/implementing-switch- cases
\newcommand{\stringcases}[3]{%
\romannumeral
\str@case{#1}#2{#1}{#3}\q@stop
}
\newcommand{\str@case}[3]{%
\ifnum\pdf@strcmp{\unexpanded{#1}}{\unexpanded{#2}}=\z@
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\str@case@end{#3}}
{\str@case{#1}}%
}
\newcommand{\str@case@end}{}
\long\def\str@case@end#1#2\q@stop{\z@#1}
但问题是,当我从数学环境调用时,\Rnl{1.1}
我得到了一个\mathbf allowed only in math mode.
虽然如果我更改\mathbf
为\textbf
它会输出{UNDEFINED_RULE 1.1}
。它不应该这样做,因为有一个案例匹配1.1
。
真正令人困惑的是,如果我只是调用\nT{1.1}
它,它就会输出“无论什么公理”,这样只要我不从另一个宏中调用它,该宏就可以工作。
下面是我打算如何使用它的可编译示例:
\documentclass{article}
\usepackage{amsmath}
%%Insert macros from above here.
\begin{document}
What I want want to be able to write:
\begin{align*}
& A \wedge B \Rnl{1.1} Bob \Rnl{2.1} T
\end{align*}
What I want to get:
\begin{align*}
&A \wedge B \\
&=\;\text{\{The rule that coresponds to 1.1 in the name table\}} \\
&Bob\\
&=\;\text{\{The rule that coresponds to 2.1 in the name table\}} \\
&T
\end{align*}
\end{document}
我该如何解决这个问题?
答案1
我在你的代码中看到了太多的括号\;
;除了糟糕的间距之外,后者没有实际后果,额外的括号是理解出了什么问题的关键。
\Rnl{1.1}
根据定义,您的代码中
&\\&\nR{\nT{{1.1}}}\\&
\nR{\nT{{1.1}}}
当然,最主要的是
=\;\{\text{{\nT{{1.1}}}}\}
现在\nT{{1.1}}
变成
\stringcases
{{1.1}}%
{%
{1.1}{Axiom of whatever}%
{2.1}{Silly theorem}%
}%
{\mathbf{UNDEFINED\_RULE\;\;{{1.1}}}}%
(我保留了换行符只是为了清晰起见)。你能看出问题所在吗?要针对这些案例进行测试的标记列表{1.1}
是才不是出现在可能的选择中。
关于的错误\mathbf
是因为这在\text
哪里\mathbf
当然是非法的。
去掉多余的括号就没问题了:
%macro for formatting rules
\newcommand{\nR}[1]{%
=\{\text{#1}\}%
}
%Prints the rule specified by the argument from the nametable in a nice formatting
\newcommand{\Rnl}[1]{%
\\
&\nR{\nT{#1}}\\
&
}
%rule nametable
\newcommand{\nT}[1]{%
\stringcases{#1}%
{%
{1.1}{Axiom of whatever}%
{2.1}{Silly theorem}%
}%
{\textbf{UNDEFINED\_RULE #1}}%
}