我想用一个命令插入格式化文本(我事先知道文本):
{\addfontfeature{LetterSpace=20.0}Решение}\
如何将其“绑定”到宏?我试过:
\def\sol#0 {{\addfontfeature{LetterSpace=20.0}Решение}}
\let\sol {{\addfontfeature{LetterSpace=20.0}Решение}}
两者都出错了。我肯定我漏掉了一些琐碎的事情。
答案1
不要用于\def
这些事情,只\newcommand
在使用 LaTeX 时使用:
\newcommand*\sol{{\addfontfeature{LetterSpace=20.0}Решение}}
\def
和\let
是纯 TeX 命令,建议使用 LaTeX 等效命令。对于你的情况,正确的使用方式\def
是:
\def\sol{{\addfontfeature{LetterSpace=20.0}Решение}}
\let
允许您复制命令,例如:
\let\solcopy\sol
现在您可以\sol
用进行更改\renewcommand
。
另请参阅:
- 维基百科 TeX/def
- 维基教科书 TeX/let
- Wikibooks LaTeX/自定义 LaTeX(更多信息请参阅
\newcommand
)。
答案2
\def
您对和的调用\let
都是有缺陷的。对于第一个,要定义一个没有参数的宏,您只需编写\def\sol{...}
,而不使用#0
:这些术语#n
并不意味着“这个宏有这么多参数”,而是“这是第 n 个参数”。因此,对于一个参数,您可以使用\def\sol#1{...}
,对于两个参数\def\sol#1#2{...}
,等等。也可以在参数之间散布其他内容来为宏创建上下文,但这与此无关。
对于第二个,\let
定义一个宏名称等于一其他标记,而不是括号组。所以你写的
\let\sol {{\addfontfeature{LetterSpace=20.0}Решение}}
与写一些具有以下更明显意图的内容相同:
\let\sol {
{\addfontfeature{LetterSpace=20.0}Решение}}
意思是\sol
变成了左括号,然后 TeX 尝试处理剩余部分,而剩余部分有一个多余的右括号(因为另一对括号刚好被 吃掉了\let
)。这就是你的错误。
话虽如此,正如 Silex 所写,最好只使用\newcommand
;\def
并且\let
对于高级文档来说太原始了。所以:
\newcommand\sol{{\addfontfeature{LetterSpace=20.0}Решение}}
附注:你应该省略\def
and后面的空格\let
;虽然这在这里是无害的,但 TeX 中不必要的空格将要导致问题(见这个)。
答案3
噢,我找到了:
\newcommand\sol{{\addfontfeature{LetterSpace=20.0}Решение}\par}