我知道 LaTeX 的吹牛点之一是它没有这种微软式的行为。尽管如此,它有时还是有用的。
在您键入(非反斜杠)句点后,LaTeX 已经添加了一个额外的空格,因此应该可以使其自动大写以下字母。
是否有一种明显的方法可以编写一个宏来执行此操作,或者是否已经有一个 LaTeX 包可以执行此操作?
我知道 LaTeX 的吹牛点之一是它没有这种微软式的行为。尽管如此,它有时还是有用的。
在您键入(非反斜杠)句点后,LaTeX 已经添加了一个额外的空格,因此应该可以使其自动大写以下字母。
是否有一种明显的方法可以编写一个宏来执行此操作,或者是否已经有一个 LaTeX 包可以执行此操作?
下面的代码解决了这个问题。
\let\period.
\catcode`\.\active
\def\uppercasesingleletter#1{\uppercase{#1}}
\def.{\period\afterassignment\periodx\let\next= }
\def \periodx{\ifcat\space\next \next\expandafter\uppercasesingleletter \else\expandafter\next\fi}
First. second.third. relax.relax. up
\let\period.
保存期
\catcode\.\active
使所有句点成为活动符号(如宏)。
\def\uppercasesingleletter#1{\uppercase{#1}}
定义宏\uppercasesingleletter
以使以下字母自动大写。
\def.{\period\afterassignment\periodx\let\next= }
写入保存的周期并检查下一个符号。
\def \periodx{\ifcat\space\next \next\expandafter\uppercasesingleletter \else\expandafter\next\fi}
如果下一个字母是空格,则\uppercasesingleletter
插入。
很久以前在 comp.text.tex 上讨论过这个想法,一般的结论是你不能令人满意地做到这一点。令人满意,在我的书中,涉及不让角色活跃,但我根本看不出它是如何工作的。
就个人而言,我想让空间处于活动状态,然后如果因子为 3000,则查看 \spacefactor 和 \MakeUppercase 以下字符。
就像是
\catcode\ \active % latex already has a saved space character -- \space
\def {\ifhmode% \spacefactor is invalid
% (or something) in vertical mode
\ifnum\spacefactor<3000\else% note: with space active,
% even cs-ended lines need %-termination
\expandafter\gobbleandupper\fi}%
\def\gobbleandupper#1{\def\tempa{#1}\def\tempb{ }%
\ifx\tempa\tempb% can''t indent the code, either :-(
% here, we have another space
\expandafter\gobbleandupper% try again
\else\space% insert a "real" space to soak up the
% space factor
\expandafter\MakeUppercase\fi}%
这并没有真正起到作用——有足够的松散末端来编织一件fairisle套头衫。例如,鉴于我们不能依赖乳胶中的 \everypar,你如何将段落的第一个字母大写?
不......不管它有多痛(这就是为什么我避免不必要的关键操作)我们需要“正确”输入乳胶:-(
我决定通过以下方式解决它:
因为我总是在我确定结果之前编译 LaTeX 代码三遍(为了获得正确的分页和引用),所以我决定在这个过程中构建句子的大写。
因此,我现在有一个 shell 脚本,它首先调用我的大写脚本(用 CRM114 编写),然后是 pdflatex 三次,然后是 okular。这样,所有的事情都发生在一个命令的结果中。