在 XeLaTeX 中伪造小写字母

在 XeLaTeX 中伪造小写字母

在文中使用 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 必须仅由字母和空格组成。没有花哨的字符或命令。

在此处输入图片描述

相关内容