Автоматически заглавная буква первого слова в новом предложении в LaTeX

Я знаю, что один из бахвальства точки латекса является то, что он не имеет такого поведения Microsoftish. Тем не менее, иногда это полезно.

LaTeX уже добавляет дополнительное пространство после ввода периода (без обратной косой черты), поэтому должно быть возможно сделать его автоматически капитализировать следующую букву.

есть ли очевидный способ написать макрос, который это делает, или есть пакет LaTeX, который это уже делает?

3 ответов


следующий код решает проблему.

\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.текст.текс, и общий вывод заключался в том, что вы не можете сделать это удовлетворительно. удовлетворительно, в моей книге, не делает персонажей активными, но я не вижу, как это может работать вообще.

лично я хотел бы сделать пространство активным, а затем посмотреть на \spacefactor и \MakeUppercase следующий символ, если коэффициент равен 3000.

что-то вроде

\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}%

это на самом деле не делает работа-есть достаточно свободных концов, чтобы связать джемпер шерстяной. например, учитывая, что мы не можем полагаться на \everypar в latex, как вы прописываете первую букву абзаца?

нет ... как бы это ни было больно (поэтому я избегаю ненужных ключевых операций), нам нужно ввести latex "правильно": - (


Я решил решить следующим образом:

поскольку я всегда компилирую код LaTeX три раза, прежде чем я окулар результат (чтобы получить разбиение на страницы и ссылки правильно), я решил построить капитализацию предложений в этот процесс.

таким образом, теперь у меня есть сценарий оболочки, который сначала вызывает мой сценарий капитализации (написанный в CRM114), затем pdflatex три раза, а затем okular. Таким образом, все происходит в результате одной команды.