在 LaTeX 的新句子中自动大写第一个单词的第一个字母

Posted

技术标签:

【中文标题】在 LaTeX 的新句子中自动大写第一个单词的第一个字母【英文标题】:Automatically capitalize first letter of first word in a new sentence in LaTeX 【发布时间】:2011-02-18 13:46:55 【问题描述】:

我知道 LaTeX 的吹牛点之一是它没有这种微软式的行为。不过,它有时还是有用的。

LaTeX 在您键入(非反斜杠)句点后已经添加了一个额外的空格,因此应该可以使其自动大写以下字母。

是否有一种明显的方法可以编写一个可以执行此操作的宏,或者是否已经有一个 LaTeX 包可以执行此操作?

【问题讨论】:

您只想输入带有小写字母的 tex 文件?为什么? 因为我经常懒得打字。 我认为,放纵你的懒惰的地方是在你的文本编辑器中。 我想知道这一点。也许我应该让 emacs 为我处理这个... 【参考方案1】:

下面的代码解决了这个问题。

\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

【讨论】:

产生以下错误:!未定义的控制序列。 .->\period \afterassignment \periodx \let \next = l.18 \parskip=0。 5\baselineskip \advance\parskip by 0pt plus 2pt ? 我想你在 catcode 之前少了一个\let\period=.。只有当你对句号的使用表现得很好时,这种令牌修改才会起作用:\em first. second 效果不佳。不过,+1 巧妙。 @Charles。正确的。我插入了它。 我只是无法让 \catcode`\.\active 行工作。它产生“未定义的控制序列”。 @Tom: \active 是纯 Tex 中用于 catcode 13 的 chardef,可能未在 Latex 中定义。尝试使用 tex/pdftex 运行它,或者改用 \catcode`\.=13。【参考方案2】:

很久以前在 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,你如何将段落的第一个字母大写?

不......不管它有多痛(这就是我避免不必要的键操作的原因)我们需要“正确”输入乳胶:-(

【讨论】:

【参考方案3】:

我决定通过以下方式解决:

由于我总是在获得结果之前编译 LaTeX 代码 3 次(以获得正确的分页和引用),因此我决定在该过程中构建句子的大写。

因此,我现在有一个 shell 脚本,它首先调用我的大写脚本(用 CRM114 编写),然后是 pdflatex 三次,然后是 okular。这样一来,所有的事情都会作为一个命令的结果发生。

【讨论】:

CRM114 脚本使用正则表达式和 linux 命令 'tr' 将任何前面有句点的小写字母(反过来,它前面没有任何已知的缩写)和一些空格变成大写信。

以上是关于在 LaTeX 的新句子中自动大写第一个单词的第一个字母的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中获取句子的第一个单词?

将每个句子的第一个字母大写python [重复]

hdu 2026 首字母变大写

HDU 2026 首字母变大写

首字母变大写(stringstream的应用)

JavaScript将字符串中的每一个单词的第一个字母变为大写其余均为小写