Команда Tex, которая влияет на следующее полное слово - PullRequest
2 голосов
/ 15 марта 2010

Можно ли использовать команду TeX, которая будет принимать в качестве аргумента целое следующее слово (или следующие буквы до, но не включая следующий символ пунктуации), а не только следующую букву или { } группа?

Мне бы хотелось иметь команду \ caps на некоторых акронимах, но я не хочу набирать фигурные скобки снова и снова.

Ответы [ 4 ]

1 голос
/ 20 марта 2010

@ Дебильски - я написал что-то похожее на ваш активный * код для сокращений в моей диссертации. Я активировал <, а затем \ def <# 1>, чтобы напечатать аббревиатуру, а также расширение, если оно встречается впервые. Я также немного вышел из глубины, позволив определить расширения в строке и использовать файлы .aux для отправки расширений «вовремя», если они используются до их объявления, или для сообщения об ошибках, если аббревиатура никогда не объявляется.

В целом, казалось, что в то время это было бы хорошей идеей - мне редко требовалось <быть catcode 12 в моем реальном тексте (поскольку все мои макросы были в отдельном файле .sty), и я заставил его вести себя в математический режим, поэтому я не мог предвидеть никаких трудностей. Но мальчик был хрупким ... Я не знаю, сколько раз я случайно ломал свою сборку, изменяя что-то, казалось бы, не связанное. Так что все, что нужно сказать, будьте <em>очень осторожно активирующими персонажей, которые даже отдаленно часто используются.

С другой стороны, для XeTeX и более высоких символов Юникода это, вероятно, намного безопаснее, и, как правило, существуют простые способы ввода этих дополнительных символов, такие как создание многослойной (или составной) клавиши (обычно я сопоставляю либо numlock, либо один из ключей Windows к этому), так что, например, мульти - - производит ¡). Или, если вы работаете в emacs, вы можете использовать C- \, чтобы ненадолго переключиться в режим ввода TeX, чтобы вставить юникод, набрав для него команду TeX (хотя это затрудняет фактический ввод документов TeX, поскольку он перехватывает ваш фактический \ и, пожалуйста, не пытайтесь определить свой собственный побег!)

1 голос
/ 17 марта 2010

Прежде всего создайте свою команду, например

 \def\capsimpl#1{{\sc #1}}% Your main macro

Решение поймать пробел или пунктуацию:

\catcode`\@=11  
\def\addtopunct#1{\expandafter\let\csname punct@\meaning#1\endcsname\let} 
\addtopunct{ }
\addtopunct{.}    \addtopunct{,}    \addtopunct{?} 
\addtopunct{!}    \addtopunct{;}    \addtopunct{:} 

\newtoks\capsarg
\def\caps{\capsarg{}\futurelet\punctlet\capsx}
\def\capsx{\expandafter\ifx\csname punct@\meaning\punctlet\endcsname\let
       \expandafter\capsend  
       \else \expandafter\continuecaps\fi}

\def\capsend{\expandafter\capsimpl\expandafter{\the\capsarg}}
\def\continuecaps#1{\capsarg=\expandafter{\the\capsarg#1}\futurelet\punctlet\capsx}

\catcode`\@=12
1 голос
/ 15 марта 2010

Относительно пробела после команд: см. Пакет xspace и пункт часто задаваемых вопросов TeX Команды проглатывают следующий пробел .

Теперь, почему это очень сложно: как вы сами отметили, подобные вещи могут быть сделаны только путем изменения катокодов. Катокоды присваиваются символам, когда TeX читает их, а TeX читает по одной строке за раз, поэтому вы не можете ничего делать с другими пробелами в той же строке, ИМХО. Возможно, есть способ обойти это, но я этого не вижу.


Опасный код ниже!

Этот код будет делать то, что вы хотите * только 1013 * в конце строки, так что если вы хотите более "свободно" печатать без скобок, но вы готовы нажать "возврат" после каждой аббревиатуры (и не запускать авто-отступ позже), вы можете использовать это:

\def\caps{\begingroup\catcode`^^20 =11\mcaps}
\def\mcaps#1{\def\next##1 {\sc #1##1\catcode`^^20 =10\endgroup\ }\next}
0 голосов
/ 15 марта 2010

Одним из решений может быть установка другого персонажа как активного и использование этого для выхода. Это не устраняет необходимость в закрывающем символе, но позволяет избежать ввода макроса \caps, что упрощает его ввод.

Поэтому при особых обстоятельствах работает следующее.

\catcode`\*=\active
\def*#1*{\textsc{\MakeTextLowercase{#1}}}

Now follows an *Acronym*.

К сожалению, это делает невозможным использование \section*{} без дополнительных определений макросов.

В Xetex представляется возможным использовать для этого символы юникода, поэтому можно определить

\catcode`\•=\active
\def•#1•{\textsc{\MakeTextLowercase{#1}}}

Now follows an •Acronym•.

Что должно уменьшить влияние на другие команды, но, разумеется, необходимо, чтобы символ «•» отображался на клавиатуре где-нибудь для использования.

...