我想使用此解决方案由@egreg 输入假小型大写字母。
由于我必须对大写/小写字母使用某些特定的字体大小,因此我\fontsize{}{}\selectfont
在命令定义中使用了一些字体大小。
由于我必须在章节标题中使用假小写字母,因此我重新定义\@makechapterhead
了\@makeschapterhead
来自book
班级如下所示并使用\fakesc{#1}
。
用的时候没问题\chapter{}
,\chapter*{}
用的时候就出现问题了\tableofcontents
,我觉得是因为用了\chapter*{}
。
我同意最好使用支持小型大写字母的字体,但不幸的是我必须使用不支持小型大写字母的特定字体。
运行时第一个错误xelatex mwe.tex
是
(/usr/local/texlive/2018/texmf-dist/tex/latex/fontspec/fontspec.cfg)))
(./mwe.aux)
! Improper alphabetic constant.
<to be read again>
\contentsname
l.66 \tableofcontents
?
平均能量损失
\documentclass[a5paper]{book}
\usepackage{showframe}
\usepackage{fontspec}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\fakesc}{ o m }
{
\guido_fakesc:n { #2 }
\IfNoValueTF{#1}
{
\tl_use:N \l__guido_temp_tl
}
{
\cs_set_eq:NN #1 \l__guido_temp_tl
}
}
\cs_new_protected:Npn \guido_fakesc:n #1
{
\tl_set:Nn \l__guido_text_tl { #1 }
\tl_replace_all:Nnn \l__guido_text_tl { ~ } { \q_space }
\tl_set:Nn \l__guido_temp_tl { \group_begin: }
\tl_map_inline:Nn \l__guido_text_tl
{
\token_if_eq_meaning:NNTF ##1 \q_space
{
\tl_put_right:Nn \l__guido_temp_tl { ~ }
}
{
\int_compare:nTF { \char_value_uccode:n { `##1 } = `##1 }
{
\tl_put_right:Nn \l__guido_temp_tl { {\fontsize{20}{22}\selectfont ##1} }
}
{
\tl_put_right:Nn \l__guido_temp_tl { \tl_upper_case:n {\fontsize{14}{14}\selectfont ##1 } }
}
}
}
\tl_put_right:Nn \l__guido_temp_tl { \group_end: }
}
\quark_new:N \q_space
\tl_new:N \l__guido_text_tl
\tl_new:N \l__guido_temp_tl
\ExplSyntaxOff
\makeatletter
\def\@makechapterhead#1{%
\begin{center}
\thechapter\par\vskip 5pt
\fakesc{#1}
\end{center}
\vskip 4cm\interlinepenalty\@M
}
\def\@makeschapterhead#1{%
\begin{center}
\fakesc{#1} %% <---------- problem here
\end{center}
\vskip 4cm\interlinepenalty\@M
}
\makeatother
\begin{document}
\tableofcontents %% <-------- problem
\chapter*{Introduction}
foo
\chapter{title}
foo
\end{document}