使用 LaTeX(不是 XeLaTeX)的大写小型大写字母?

使用 LaTeX(不是 XeLaTeX)的大写小型大写字母?

其中XeLaTeX有一个UppercaseSmallCaps字体选项(如这个问题例如),这将导致大写字母呈现为小写字母,而小写字母保持不变。

问题:如何以纯文本(或)UppercaseSmallCaps实现,以便将类似文本呈现为?LaTeXpdfLaTeX\upsc{ABCdef}\textsc{abc}def

答案1

\documentclass[convert,border=1]{standalone}

\makeatletter
\newif\ifsc@active
\newif\ifnf@active
\def\upsc#1{{\sc@activefalse\nf@activetrue\@upsc#1\@nil}}
\def\@upsc#1{\ifx#1\@nil\else\@@upsc{#1}\expandafter\@upsc\fi}
\def\@@upsc#1{%
  \ifnum\uccode`#1=`#1\relax
     \ifsc@active\else\sc@activetrue\nf@activefalse\scshape\fi
     \expandafter\@firstoftwo
   \else
     \ifsc@active\sc@activefalse\fi
     \ifnf@active\else\nf@activetrue\normalfont\fi
     \expandafter\@secondoftwo
   \fi
     {\lowercase{#1}}%
     {#1}}
\makeatother

\begin{document}
\upsc{xABCdovff}
\end{document}

当然,不适用于重音字母。

enter image description here

答案2

可能有点夸张,但你可以使用l3regex为了达成这个

\documentclass{article}
\usepackage{l3regex,xparse}
\ExplSyntaxOn
\cs_generate_variant:Nn \tl_rescan:nn { nV } 
\NewDocumentCommand \upsc { m }
  {
    \tl_set:Nn \l_tmpa_tl {#1}
    \regex_replace_all:nnN { ([A-Z]+) }
      { \c{textsc} \cB\{ \c{lowercase} \cB\{ \1 \cE\} \cE\} } \l_tmpa_tl
    \tl_use:N \l_tmpa_tl
  }
\ExplSyntaxOff
\begin{document}
\upsc{ABCabcDEF}
\end{document}

这使用了最新的实验版本l3regex,该版本位于 CTAN 上,并且具有“扩展正则表达式”系统,允许在搜索和替换文本中包含类别代码信息。

您可以使用其他方法以相同的方式设置大写字母搜索(例如xstring)。


代码解释

这里的基本思想是存储文本,进行替换,然后再次打印。我选择将每个大写字母 <Letter> 替换为

\textsc{\lowercase{<Letter>}}

搜索部分是一个简单的正则表达式([A-Z]+),它将捕获字母为\1(在替换部分中)。在那里,将在更新的文本中\c{textsc}创建控制序列并创建。是从搜索部分捕获的字母,而和可能需要一点解释。在替换文本中,创建类别代码为“开始组”的字符(需要转义)。同样,创建类别代码为“结束组”的字符。\textsc\c{lowercase}\lowercase\1\cB\{\cE\}\cB\{{\cE\}}

最后一步是将结果插入到输入流中。如果你想看看发生了什么,请尝试在行\tl_show:N \l_tmpa_tl后添加\tl_use:N

相关内容