我发现自己需要定义许多与变量、空格等相关的不同宏,以帮助定义一致的字体选择(\mathsf、\mathcal、normal 等)。这些基本上都看起来像:
\newcommand{\P}{\ensuremath{\mathcal{P}}\xspace}
它可以\P
在文本/数学模式下使用,不会占用其后的空格等。本质上这就是我想要的符号定义。
我已将该命令系统抽象为以下构造函数:
\newcommand{\makespace}[2]{\newcommand{#1}{\ensuremath{\mathcal{#2}}\xspace}}
使用此宏,我将\makespace{\P}{P}
生成我编写的第一个宏,这使我的所有宏定义更加一致/可读。我可以就此打住,但我需要定义多个构造函数 - 例如,如下所示:
\newcommand{\makeconstant}[2]{\newcommand{#1}{\ensuremath{\mathsf{#2}}\xspace}}
(其中\mathcal
被替换为\mathsf
)也需要定义。因此,创建构造函数的构造函数似乎是明智的,我想象它看起来会像这样:
\newcommand{\makeconstructor}[2]{\newcommand{#1}[2]{\newcommand{#1'}{\ensuremath{#2{#2'}}\xspace}}}
这是我的问题 - 我想要这个双参数宏返回一个双参数宏。我如何区分 #1 和 #1'(我确定这是不正确的符号)?在定义这样的高阶函数时,“保持参数分离”的正确方法是什么?
答案1
摘要格式命令
\newcommand{\newdescriptor}[3]{\newcommand{#1}{#2{#3}}}
然后
\newdescriptor{\sP}{\mathbf}{P}
会做
\newcommand{\sP}{\mathbf{P}}
我没有看到任何比直接定义更好的东西除非你做了进一步的抽象步骤:
\newcommand{\whatever}[1]{\mathbf{#1}}
\newcommand{\constant}[1]{\mathsf{#1}}
\newcommand{\newdescriptor}[3]{\newcommand{#1}{#2{#3}}}
\newdescriptor{\sP}{\whatever}{P}
\newdescriptor{\cs}{\constant}{S}
如果你真的想要的话,可以添加\ensuremath
和\xspace
。我永远不会相信输入
The constant \cS is nice
比打字更好
The constant \(\cS\) is nice
老实说,我发现第二种方法是唯一好的方法(与之相当$\cS$
)。
答案2
在定义的替换文本中,#2
被第二个参数替换,#1
被第一个参数替换,##
被替换#
为
\documentclass{article}
\usepackage{xspace}
\newcommand{\makeconstructor}[2]{%
\newcommand{#1}[2]{\newcommand{##1}{\ensuremath{#2{##2}}\xspace}}}
\makeconstructor\makespace\mathcal
\makeconstructor\makewidget\mathsf
\makespace\SP{P}
\makespace\SQ{Q}
\makewidget\WP{P}
\makewidget\WQ{Q}
\begin{document}
$\SP<\SQ<\WP<\WQ$
\end{document}
答案3
根据评论,主要问题可以通过定义新的排版“样式”来解决。要一键更改所有内容,我们现在可以编辑序言中的一行。
\documentclass{article}
\newcommand{\mystyle}[1]{\mathcal{#1}}
\newcommand{\player}{\mystyle{P}}
\begin{document}
\noindent
Here is calligrafic font.
\[
\player
\]
Oops, seems like now I want all letters to be Sans Serif.
\renewcommand{\mystyle}[1]{\mathsf{#1}}
\[
\player
\]
\end{document}