![\textsuperscript 和 \titlecap 的不同顺序有不同的效果](https://linux22.com/image/433179/%5Ctextsuperscript%20%E5%92%8C%20%5Ctitlecap%20%E7%9A%84%E4%B8%8D%E5%90%8C%E9%A1%BA%E5%BA%8F%E6%9C%89%E4%B8%8D%E5%90%8C%E7%9A%84%E6%95%88%E6%9E%9C.png)
在我的代码中这工作正常:
\textsuperscript{\titlecap{some text}}
但这不能编译:
\titlecap{\textsuperscript{some text}}
为什么标签的顺序在这里很重要?
答案1
\titlecap
必须逐个字符地检查其内容。它包括一些格式化命令的特殊配置,特别是基本 LaTeX 字体选择命令(连同其自己的\textnc
命令,该命令指定不应被更改的文本)\titlecap
。
如果你texdoc titlecaps
在计算机上输入命令行,你将会调出关于该包的文档titlecaps
,其中介绍了该包的局限性以及它是如何工作的(完整的代码清单为那些愿意调查详细情况并了解如何添加\textsuperscript
允许的格式化命令的人提供了文档(考虑到包的结构,这无疑是一项不简单的任务)。
答案2
由于 Don 刚刚在我的软件包(titlecaps
)上击败了我,我必须深入挖掘我的技巧并找到一种tokcycle
可以同时适用于这两种语法形式的方法。
按照目前的设置,当在输入流中遇到以下任何内容时,都会触发下一个 catcode-11 标记的未来大写:
最初进入常规
catcode-10 空间令牌
连字符
-
进入团体后
{...}
显然,可以添加其他测试。以下是 MWE:
\documentclass{article}
\usepackage{tokcycle}
\newcommand\TitleCase[1]{%
\def\capnext{T}% <- INITIAL ENTRY
\tokcycle
{\nextcap{##1}}
{\def\capnext{T}\processtoks{##1}}% <- GROUP ENTRY
{\addcytoks{##1}}
{\addcytoks{##1}\def\capnext{T}}% <-CAT-10 SPACE
{#1}%
\the\cytoks
}
\newcommand\nextcap[1]{%
\edef\tmp{#1}%
\tctestifx{-#1}{\def\capnext{T}}{}% <- TEST FOR HYPHEN
\tctestifcon{\if T\capnext}%
{\tctestifcon{\ifcat\tmp A}% <- TEST FOR NEXT CAT-11
{\addcytoks{\uppercase{#1}}\def\capnext{F}}%
{\addcytoks{#1}}}%
{\addcytoks{#1}}%
}
\begin{document}
This\textsuperscript{\TitleCase{some text}}.
versus\TitleCase{\textsuperscript{some text}}.
\TitleCase{%
|here, {\bfseries\today{}, is [my]}
really-big-test
(\textit{capitalizing} words). abc\textsuperscript{def}|
here, {\bfseries\today{}, is [my]}
really-big-test
(\textit{capitalizing} words). abc\textsuperscript{def}}
\end{document}
通过在排版之前而不是排版过程中执行条件测试,编辑了字距调整功能,从而实现了更好的字距调整。因此,在排版时,对于最后一个块(用 看到\detokenize\expandafter{\the\cytoks}
),这实际上是排版的内容: