在文中使用 XeTeX/fontspec 伪造小型大写字母?我发现以下定义可以伪造小写字母
\def\mycommand{\bgroup\obeyspaces\mycommandaux}
\def\mycommandaux#1{\mycommandauxii #1\relax\relax\egroup}
\def\mycommandauxii#1{%
\ifx\relax#1\else
\ifcat#1\@sptoken{}
\expandafter\expandafter\expandafter\mycommandauxii\else
\ifnum`#1=\uccode`#1 {\normalsize #1}\else {\footnotesize \uppercase{#1}}\fi
\expandafter\expandafter\expandafter\mycommandauxii\expandafter\fi\fi}
% ...
\mycommand{This text is set in fake small caps.}
\mycommand
在正文中可以正常工作。但是,当在其他命令(如of)\mycommand
中使用时,它会删除单词之间的空格。\title
\footnote
所以我想知道是否有任何方法可以使上述命令在其他命令中起作用,或者是否有其他方法可以实现相同的结果。
在上面的代码中\normalsize
,\footnotesize
可以替换一些\fontspec
指令。该方法(或类似方法)的一个优点是它可以用于没有小写字母的通用字体(我知道fontinst
并支持在 fontforge 中创建小写字母)
答案1
一种不同的方法:\fakesc
您可以将“伪造的”文本存储在控制序列中以供日后使用。
\documentclass[]{article}
\usepackage{fontspec,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: \footnotesize }
\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 { {\normalsize ##1} }
}
{
\tl_put_right:Nn \l__guido_temp_tl { \tl_upper_case:n { ##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
\begin{document}
\fakesc[\mytitle]{This is the title}
\title{\mytitle}
\author{An Author}
\maketitle
\fakesc{All inside this are fake caps} and this is normal
\end{document}
但这只是一个 hack,真实的应该优先使用小写字母。\fakesc
必须仅由字母和空格组成。没有花哨的字符或命令。