从宏中调用宏会破坏参数格式,导致奇怪的环境行为

从宏中调用宏会破坏参数格式,导致奇怪的环境行为

我正在尝试编写一个小型 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}}%
}

相关内容