假设我有以下代码:
\documentclass{article}
\usepackage{xspace}
\def\cal#1{\ensuremath{\mathcal{#1}}\xspace}
\newcommand{\calA}{\cal A}
\begin{document}
Let \calA be a linearly ordered set.
\end{document}
现在,想象一下我需要对单个字母使用大量数学运算,我该如何让 latex 自动推断/自动生成 X 为大写字母的定义\calX
。当然,我可以生成 26 个新命令,但我不想这样做。
我的意思是我不想在\cal
和之间留空格X
。有什么技巧可以做到这一点吗?
答案1
控制序列要么已定义,要么未定义。没有办法说
嘿,TeX,如果你发现一个以 开头的控制序列,后面
\cal
跟着一个大写字母,比如说X
,并且它当前未定义,请将其定义为\mathcal{X}
。
嗯,可能会有一些非常脆弱有很多方法可以做到这一点。在使用复杂而脆弱的代码和定义所需的宏之间进行权衡,最终选择后者。
使用建议的代码要简单得多自动生成新命令或者代码https://tex.stackexchange.com/a/207992/4427用于批量定义您需要的宏。
关于\ensuremath
和\xspace
,我建议坚持使用$\calA$
,这样输入起来不会太困难,而且包含更多的语义。
答案2
\documentclass{article}
\usepackage{listofitems,xspace}
\newcommand\makecalx[1]{%
\expandafter\def\csname cal#1\endcsname{\ensuremath{\mathcal{#1}}\xspace}%
}
\readlist\callets{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}
\foreachitem\z\in\callets[]{\expandafter\makecalx\expandafter{\z}}
\begin{document}
Here is \calG and \calZ.
\end{document}