在法语中,如果可用,则习惯将世纪和其他罗马数字排版为小写字母,如果没有,则使用正常(大写)大写字母。如果我过去\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 行。