简化手动递归

简化手动递归

以下内容实际上是从 *.tex 文件中复制/粘贴的:

\newcommand{\bA}{\mathbf{A}}
\newcommand{\bB}{\mathbf{B}}
\newcommand{\bC}{\mathbf{C}}
\newcommand{\bD}{\mathbf{D}}
\newcommand{\bE}{\mathbf{E}}
\newcommand{\bF}{\mathbf{F}}
\newcommand{\bG}{\mathbf{G}}
\newcommand{\bH}{\mathbf{H}}
\newcommand{\bI}{\mathbf{I}}
\newcommand{\bJ}{\mathbf{J}}
\newcommand{\bK}{\mathbf{K}}
\newcommand{\bL}{\mathbf{L}}
\newcommand{\bM}{\mathbf{M}}
\newcommand{\bN}{\mathbf{N}}
\newcommand{\bO}{\mathbf{O}}
\newcommand{\bP}{\mathbf{P}}
\newcommand{\bQ}{\mathbf{Q}}
\newcommand{\bR}{\mathbf{R}}
\newcommand{\bS}{\mathbf{S}}
\newcommand{\bT}{\mathbf{T}}
\newcommand{\bU}{\mathbf{U}}
\newcommand{\bV}{\mathbf{V}}
\newcommand{\bW}{\mathbf{W}}
\newcommand{\bX}{\mathbf{X}}
\newcommand{\bY}{\mathbf{Y}}
\newcommand{\bZ}{\mathbf{Z}}

有没有办法通过在 AZ 上使用某种 for 循环来简化这个问题?

谢谢!

答案1

使用该etoolbox包,您可以执行以下操作:

\RequirePackage{etoolbox}
\def\parser #1{\expandafter\def\csname b#1\endcsname{\mathbf{#1}}}
\forcsvlist{\parser}{A,B,C,D,E,F,G,H,I,J,K,L,M,O,P,Q,R,S,T,U,V,W,X,Y,Z}

请注意,您提供的列表\forcsvlist实际上可以是任何内容(当然,除了包含逗号的内容)。

这将循环遍历您提供的“逗号分隔值”列表中的元素,并将它们逐个传递给\parser定义您想要的内容的宏。

这种方法的优点是它非常紧凑,用户易于阅读。您还可以轻松更改要执行的操作、前缀或与格式相关的字符串列表。此外,可能etoolbox无论如何都会由另一个包加载,因此您无需加载任何新内容。

不便之处与@DavidCarliste 的回答相同。LaTeX 处理速度相当慢。但是,除非您真的有很多元素需要循环,否则这种效果不会显现出来。

答案2

正如我在评论中提到的那样,我不会这样做。但如果我想这样做,我可能会这样做

\documentclass{article}

\makeatletter


\count@`\A
\loop
\lccode`\.\count@
\lowercase{\@namedef{b.}{\mathbf.}}%
\advance\count@\@ne
\ifnum\count@>`\Z\else
\repeat


\show\bA
\show\bC
\show\bZ

\stop

答案3

你在这里做的不是递归。递归意味着一个函数(或宏TeX)调用(即扩展为包含)自身。你只是在重复类似的代码,这当然可以用循环来表达。

尽管如此,我认为这种方法不会给你带来太多好处。除了\b A/\bA参数之外,David 的代码肯定不会比你原来的代码快很多。它甚至没有明显缩短。

我只想将这 26 行放入一个单独的包中。因此只需创建一个mathbfcmds.sty文件(在您的PATH):

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mathbfcmds}[2012/08/21]

\newcommand{\bA}{\mathbf{A}}
...

在任何TeX想要使用它的文档中,你都可以这样做\usepackage{mathbfcmds}。这样你就可以真正节省一些精力,而不会混淆代码,而且无论你再添加一百个这样的声明都没关系。

答案4

您可以使用该pgffor包。

\documentclass{article}

\usepackage{pgffor}


\begin{document}\scrollmode


\makeatletter
\foreach \m in {A,B,C,D,E}
{
    \expandafter\protected@xdef\csname b\m\endcsname{\mathbf{\m}}
}
\makeatother

$\bA$
$\bD$
$\bC$
$\bE$
$\bB$
\end{document} 

代码只是使用 foreach 在循环中定义宏。但要做到这一点,必须正确扩展循环变量\m。这有点棘手,因为\mathbf{\m}很难扩展。必须使用才能\protected@xdef使其工作。(\xdef 单独似乎不起作用,\gdef似乎不允许扩展第二个\m

请注意,此代码盲目地定义了可能已经存在的宏。

相关内容