2010-05-12 4 views
9

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

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

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

+1

Вы хотите набирать тексты tex только с помощью небольших букв? Зачем? – aioobe

+1

, потому что часто я слишком ленив, чтобы набирать кепки. – memius

+11

Я думаю, что место, где вы ленитесь, в вашем текстовом редакторе. –

ответ

1

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

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

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

+0

Сценарий CRM114 использует regexp и команду linux 'tr', чтобы превратить любую строчную букву, предшествующую периоду (которому, в свою очередь, не предшествуют какие-либо известные сокращения) и некоторые пробелы в прописную букву. – memius

4

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

\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.

+0

, который вызвал следующую ошибку: ! Неопределенная последовательность управления. .-> \ period \ после назначения \ periodx \ let \ next = l.18 \ parskip = 0. 5 \ baselineskip \ advance \ parskip by 0pt plus 2pt ? – memius

+0

не могли бы вы добавить пару комментариев к вашему коду, пожалуйста :) – memius

+1

Я думаю, что вам не хватает '\ let \ period = .' перед кодом. Этот вид маркерного манипулирования будет работать только в том случае, если вы хорошо относитесь к тому, как вы используете периоды: '{\ em first.} Second' не работает так хорошо. +1 изобретательный, хотя. –

2

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

лично, я хотел бы сделать пространство активным, и он затем посмотреть на \ 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}% 

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

нет ... Но это больно (именно поэтому я избежать ненужных ключевых операций) необходимо ввести латекс «правильно» :-(