定义的命令仅在前导码中起作用

定义的命令仅在前导码中起作用

我正在编写一个类,在使用它时,我想使用没有定义小写字母的字体的小写字母(我知道 - 不如真正的字体好)。我找到了这个答案使用 XeTeX/fontspec 伪造小型大写字母?我尝试将其包括在内,但是出现错误:

Missing $ inserted. Missing $ inserted. You can't use '\spacefactor' in vertical mode.

然而,当将代码粘贴到序言中时,它就能完美运行。

有人知道发生了什么事吗?

平均能量损失

类文件

\ProvidesClass{custom}[a custom class]
\NeedsTeXFormat{LaTeX2e}

\DeclareOption*{
    \PassOptionsToClass{\CurrentOption}{scrreprt}
}
\ProcessOptions\relax

\LoadClass[usegeometry]{scrreprt}


\RequirePackage{graphicx}

\RequirePackage{plex-serif}

% Small Caps

\makeatletter
\newlength\fake@f
\newlength\fake@c
\def\fakesc#1{%
\begingroup%
\xdef\fake@name{\csname\curr@fontshape/\f@size\endcsname}%
\fontsize{\fontdimen8\fake@name}{\baselineskip}\selectfont%
\uppercase{#1}%
\endgroup%
}
\makeatother

\newcommand\fauxsc[1]{\fauxschelper#1 \relax\relax}
\def\fauxschelper#1 #2\relax{%
\fauxschelphelp#1\relax\relax%
\if\relax#2\relax\else\ \fauxschelper#2\relax\fi%
}
\def\Hscale{.83}\def\Vscale{.72}\def\Cscale{1.00}
\def\fauxschelphelp#1#2\relax{%
\ifnum`#1>``\ifnum`#1<`\{\scalebox{\Hscale}[\Vscale]{\uppercase{#1}}\else%
    \scalebox{\Cscale}[1]{#1}\fi\else\scalebox{\Cscale}[1]{#1}\fi%
\ifx\relax#2\relax\else\fauxschelphelp#2\relax\fi}

\makeatletter
\newcommand{\maketitleee}{
    \fauxsc{\@title}
}
\makeatother

文档

\documentclass[a4paper, 12pt, oneside]{custom}

\title{Title}
\author{Author}

\begin{document}

\maketitleee

\end{document}

更新

删除所有\makeatletters 和\makeatothers 似乎会改变以下给出的错误

错误

更新 2

这个问题已根据 @moewe 的建议修复,替换\fauxsc{\@title}\expandafter\fauxsc\expandafter{\@title}

答案1

首先,也是最重要的一点:为没有小写字母的字体伪造小写字母是毫无希望的。


当 LaTeX 读取.cls文件时,\makeatletter隐式生效,并且发布\makeatother很可能会引发问题。

确实如此,因为当我们定义 时\maketitlee@是一个“其他字符”,因此定义变成

• •\makeatletter•\@•t•i•t•l•e•\makeatother•

用于分隔标记)。请注意,\maketitlee调用时,替换文本已被标记化,因此\makeatletter不会执行任何操作。

切勿在文件中使用\makeatletterand ,除非\makeatother.cls身体宏定义在其操作中包括输入文件,而该文件@需要特殊处理。您的宏并非如此\maketitlee


在类文件中的所有位置删除\makeatletter和之后,编译示例文件不会产生任何错误,并且输出为\makeatother.tex

在此处输入图片描述

这清楚地表明了我在这个答案的第一行所表达的意思。

相关内容