我读过了TeX 常见问题 —— \newfont 有什么问题?但是,我还是想知道这个问题的答案。在我使用的样式文件中有:
\newfont{\myfont}{cmr17 scaled 2000}
... 但是,我想在加载样式文件后(但仍在文档序言中)使用较小的缩放比例(1200)“重载”/重新定义它。我想我会喜欢使用类似的东西- 但显然,\renewfont 不存在 :)\renewfont{\myfont}{cmr17 scaled 2000}
从 \newfont定义命令名称cmd,目前还未定义,我猜这个问题的答案是否定的——但我最好确定并问一下:是否有一种技术可以让我“超载”由制作的字体\newfont
?
答案1
正如常见问题解答中提到的,\newfont
这是一个非常简单的原始包装器\font
。它实际上只是在字体已定义时添加一个测试。因此,如果您想覆盖定义,只需使用原始命令:
\font\myfont=cmr17 scaled 1200 \relax
但我的建议是避免使用这种硬编码的字体定义。它们会使样式难以维护,而且 — — 如你所见 — — 进行微小更改也会很麻烦。
答案2
谢谢Joon 的博客:如何在 LaTeX 中取消定义命令,我想我有它:
% undefine \myfont
\makeatletter
\let\myfont\@undefined
\makeatother
% ... then define it again:
\newfont{\myfont}{cmr17 scaled 1200}
希望这对某人有帮助,
干杯!
答案3
此代码将\xnewfont
具有与 相同的语法\newfont
,但仅当控制序列的定义不是字体选择命令,在这种情况下,它将覆盖它。
但是,应该遵循 Ulrike 的建议:根据更高级的宏来定义字体,例如\usefont
。
\makeatletter
\def\@newfont#1#2{\font#1=#2\relax}
\def\xnewfont#1{%
\ifdefined#1%
\def\next{\@iffont{#1}}%
\else
\def\next{\@newfont{#1}}%
\fi\next}
\def\@iffont#1{%
\edef\next{\meaning#1}\ch@ckiffont
\if@tempswa
\def\next{\message{*** Overwriting meaning of font \string#1*** ^^J}%
\@newfont{#1}}%
\else
\def\next{\@ifdefinable#1}%
\fi\next}
\def\ch@ckiffont{%
\edef\next{\next\detokenize{select font}\noexpand\@nil}%
\expandafter\ch@ck@ffont\next}
\begingroup
\edef\x{\endgroup
\def\noexpand\ch@ck@ffont##1\detokenize{select font}##2\noexpand\@nil}%
\x{\if\relax\detokenize{#1}\relax\@tempswatrue\else\@tempswafalse\fi}
\makeatother