我熟悉\foreach
TikZ 包中的循环。是否有类似的循环可以在我的序言中使用?我喜欢使用\M
、、和\A
其他\I
命令作为矩阵的简写。因此,不必编写
\renewcommand\S{\mathbf S}
\newcommand\V{\mathcal V}
\newcommand\E{\mathcal E}
\newcommand\M{\mathbf M}
\newcommand\A{\mathbf A}
\newcommand\z{\mathbf z}
\newcommand\x{\mathbf x}
\newcommand\B{\mathbf B}
\newcommand\I{\mathbf I}
\newcommand\J{\mathbf J}
\newcommand\X{\mathbf X}
\newcommand\Q{\mathbf Q}
我可以做些什么
\foreach \x in {S, V, E, M, A, z, x, B, I, J, X, Q}{
\let\x\relax
\newcommand \\x {\mathbf \x}
}
我只是想让我的序言看起来更简洁一些。我也愿意听取其他建议。
答案1
以下是在 LaTeX 中使用 for 循环的一种方法,不需要任何包:
\documentclass[]{article}
\makeatletter
\@for\cs:={S,V,E,M,A,z,x,B,I,J,X,Q}\do{
\expandafter\newcommand\csname my\cs\endcsname{}% check whether the command is already defined
\expandafter\edef\csname my\cs\endcsname{\noexpand\mathbf{\cs}}% define it expanding \cs
}
\makeatother
\begin{document}
$\myS$
\end{document}
答案2
与 Skillmon 类似,但用于etoolbox
更简单的代码。我还建议为宏添加前缀,以避免无意中覆盖内置宏。
这可以很容易地适应其他情况。
\documentclass{article}
\usepackage{etoolbox,bm}
\newcommand\Maker[1]{
\ifcsundef{bf#1}{
\csdef{bf#1}{\bm{#1}}
}{
\typeout{Cannot make \string\bf#1, already exists, ignoring}
}
}
\forcsvlist\Maker{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}
\forcsvlist\Maker{A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z}
\begin{document}
\[
\bfa
\]
\end{document}
答案3
如果您想要干净的语法,expl3
那么它适合您。
\usepackage{expl3}
\ExplSyntaxOn % access the programmer's level
\clist_map_inline:nn
{ S, V, E, M, A, z, x, B, I, J, X, Q }
{
\cs_new_protected:cpn {b#1} { \mathbf{#1} }
}
\ExplSyntaxOff
这将定义\bS
,\bV
等等。避免重新定义诸如 之类的命令\S
。如果你想冒险,请使用\cs_set_protected:cpn
而不是\cs_new_protected:cpn
,但如果出现问题,那就怪自己吧。