其中XeLaTeX
有一个UppercaseSmallCaps
字体选项(如这个问题例如),这将导致大写字母呈现为小写字母,而小写字母保持不变。
问题:如何以纯文本(或)UppercaseSmallCaps
实现,以便将类似文本呈现为?LaTeX
pdfLaTeX
\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}
当然,不适用于重音字母。
答案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
。