以下内容实际上是从 *.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
)
请注意,此代码盲目地定义了可能已经存在的宏。