我正在编写一个类,在使用它时,我想使用没有定义小写字母的字体的小写字母(我知道 - 不如真正的字体好)。我找到了这个答案使用 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}
更新
删除所有\makeatletter
s 和\makeatother
s 似乎会改变以下给出的错误
更新 2
这个问题已根据 @moewe 的建议修复,替换\fauxsc{\@title}
为\expandafter\fauxsc\expandafter{\@title}
答案1
首先,也是最重要的一点:为没有小写字母的字体伪造小写字母是毫无希望的。
当 LaTeX 读取.cls
文件时,\makeatletter
隐式生效,并且发布\makeatother
很可能会引发问题。
确实如此,因为当我们定义 时\maketitlee
,@
是一个“其他字符”,因此定义变成
• •\makeatletter•\@•t•i•t•l•e•\makeatother•
(•
用于分隔标记)。请注意,\maketitlee
调用时,替换文本已被标记化,因此\makeatletter
不会执行任何操作。
切勿在文件中使用\makeatletter
and ,除非\makeatother
.cls
身体宏定义在其操作中包括输入文件,而该文件@
需要特殊处理。您的宏并非如此\maketitlee
。
在类文件中的所有位置删除\makeatletter
和之后,编译示例文件不会产生任何错误,并且输出为\makeatother
.tex
这清楚地表明了我在这个答案的第一行所表达的意思。