Я хотел бы определить макрос, длина которого составляет не более одного токена.
\w
— это макрос, и все, что находится после w, не рассматривается как часть имени макроса. \wTest
то же самое, что\w Test
. Мне все равно, если нет других макросов, начинающихся сжперепутаны (по крайней мере в моем документе, так как я их не использую). Очевидно, что это не должно мешать другим пакетам.
В качестве альтернативы, если это невозможно, я бы хотел иметь возможность переопределить какой-нибудь специальный символ, например ^
или |
для выполнения этой работы. Я бы, скажем, возможно, хотел использовать его без .
Предположим, я хочу |
что-то напечатать.
\documentclass{article}
\def\|{hello\,}
\begin{document}
\|world
\end{document}
Но я бы предпочел сделать |world. (мой документ настолько прост, что содержит всего два-три специальных макроса, что будет гораздо логичнее свести эти разметки к максимально простому представлению. Я, например, никогда не буду использовать |
или ^
в своем документе обычным образом, поэтому я могу использовать их для представления некоторой разметки. Мне нужно только разобраться с тем, как их интерпретирует tex). В моем собственном документе нет никакого риска, поскольку это либо плоский текст, либо очень мало макросов tex/latex (я использую \vspace и \hspace, а также несколько простых окружений, таких как центрирование, вместе с 3 моими собственными макросами для разметки простого текста).
например,
Я мог бы иметь
This is a |test paragraph^.
\begin{center} and this^ is |centered \end{center}
где | и ^ могут быть довольно сложной (длинной) разметкой, которая загромождает исходный абзац. На самом деле, было бы неплохо даже избавиться от окружений:
This is a |test paragraph^.
<and this^ is |centered>
(обратите внимание, что второй вариант гораздо более удобочитаем, чем первый)
решение1
Я думаю, что ваше первое предложение (макрос, который называется \w
так, что \wTest
обрабатывается так же, как \w Test
) потребует много хака. Для второго вам просто нужно установить catcode соответствующего символа на \active
.
\documentclass{article}
\catcode`|=\active
\def|{abc}
\begin{document}
|
\end{document}
решение2
Вам следует отказаться от идеи команды с одним символом \w
: вам придется изменить\catcode
w, и это повлияет не только на команды, которыеначинатьс w, но все команды, в названии которых есть w, могут иметь весьма неожиданные побочные эффекты, даже если сам документ не содержит w:
\documentclass{article}
\begin{document}
\catcode`\w=12
\tableofcontents
\section{abc}
\end{document}
То же самое касается и других ваших идей: недостаточно быть уверенным, что вы никогда не введете определенный символ. Вы также должны быть уверены, что никакой внешний файл (типа toc, aux, lof, bbl, ....) не использует его.
решение3
Если вы используете LuaTeX, то можно перехватить текстовый файл до того, как его увидит движок набора. Например, в ConTeXt можно использовать следующее:
\usemodule[translate]
\def\wTest{default}
\translateinput[\string\w][Something else ]
\starttext
\wTest
\enableinputtranslation
\wTest \crlf
\wAgain
\disableinputtranslation
\wTest
\stoptext
который дает
Видетьпортирование модуля luatex/ConTeXt «перевод» в luaLaTeXдля порта модуля translate
в luaLaTeX.
решение4
лучше всего выбрать неалфавитный символ, который еще не используется для чего-то другого или используется только в особых ситуациях.
|
используется (в парах) для дословного сокращения некоторыми пакетами, но если вам это не нужно, это разумный кандидат. +
, <
или >
могут быть хорошими кандидатами. если вам никогда не нужны помеченные команды или среды Latex, есть *
.
Я бы посоветовал держаться подальше от следующих: ~
, #
, $
, @
, %
, ^
, _
и, конечно же \
.
Обычный текс, скорее всего, будет гораздо более щадящим, чем латекс, но, конечно, тогда у вас не будет преимуществ существующих упаковок.