如果有小写字母,则使用小写字母;如果没有,则使用普通(大写)字母

如果有小写字母,则使用小写字母;如果没有,则使用普通(大写)字母

在法语中,如果可用,则习惯将世纪和其他罗马数字排版为小写字母,如果没有,则使用正常(大写)大写字母。如果我过去\textsc{vi}排版“6”,如果没有小写字母,我冒着被排版为“vi”的风险。

有没有办法在可用的情况下使用小写字母,否则使用普通(大写)字母?(使用 pdfLaTeX 和 XeLaTeX)

答案1

可能不是您所想的,但一个实用的解决方案是在序言中定义一个命令,选择大写字母或小型大写字母,并通过选择字体启用此功能。

\newcommand\mysc[1]{\textsc{#1}}
...
\usepackage{font with no small caps}
\renewcommand\mysc[1]{\MakeUppercase{#1}}

因为无论如何你都必须改变你的序言来选择一种新的字体,如果你通过字体选择保持这个重新定义正确,那么应该很容易做到。

以下是实现自动化的尝试。警告:当前的代码非常脆弱,但它展示了基本思想。我正在使用没有小写字母的 bera-sans。

\documentclass{minimal}

\usepackage[scaled]{berasans}
\renewcommand*\familydefault{\sfdefault}
\usepackage[T1]{fontenc}
\normalfont

\providecommand{\mysc}[1]{\textsc{#1}}

\makeatletter
\fontshape\scdefault
\expandafter\ifx\csname\curr@fontshape\endcsname\relax
  \renewcommand{\mysc}[1]{\MakeUppercase{#1}}
\fi
\makeatother

\begin{document}
2000\textsc{ad} vs 2000\mysc{ad}.
\end{document}

在此处输入图片描述

\curr@fontshape这个想法是,使用 NFSS,如果提供了字体,宏将扩展为定义的命令名称(在本例中\curr@fontshape -> T1/fvs/m/sc为命令\T1/fvs/m/sc -> \relax将扩展为定义的命令名称。我不得不这样做 \selectfont被调用,否则将定义替换(\<->s*[.9]fvsr8t在这种情况下)所以我在测试中使用\fontshape\scdefault而不是\scshape(因为后者调用\selectfont)。

即使定义了替换,人们也可能会对命令进行一些文本处理来改变行为,但我现在不确定如何最好地做到这一点。

参考

  • 源2e.pdf:我找不到任何明确记录这一点的地方,所以我不得不查看源代码。例如,参见第 294 行。

相关内容