可以重新定义 \newfont 吗?

可以重新定义 \newfont 吗?

我读过了TeX 常见问题 —— \newfont 有什么问题?但是,我还是想知道这个问题的答案。在我使用的样式文件中有:

\newfont{\myfont}{cmr17 scaled 2000}

... 但是,我想在加载样式文件后(但仍在文档序言中)使用较小的缩放比例(1200)“重载”/重新定义它。我想我会喜欢使用类似的东西\renewfont{\myfont}{cmr17 scaled 2000}- 但显然,\renewfont 不存在 :)

从 \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

相关内容