Вы можете фактически получить именно то, что вы хотите:
\newcommand{\dialogueline}{\begingroup\catcode`\^^M=12 \[email protected]}
{\catcode`\^^M=12\gdef\[email protected]#1#2^^M{\begin{dialogue}{#1}#2\end{dialogue}\endgroup}}
Этот код должен быть \makeatletter
-protected — либо в окружении \makeatletter
/\makeatother
(редактировать: это означает, что перед тем, как вы определили \makeatletter
, и \makeatother
после него) или в файле .sty
. Обратите внимание, что среда с именем dialogue
определяет команду с именем \dialogue
, поэтому вам нужно другое имя. Не изменяйте форматирование!
Способ, которым это работает, заключается в том, что \dialogueline
- это команда, которая не принимает аргументов, а расширяет ее до нескольких последовательностей. Во-первых, токен, открывающий группу, чтобы поставить все, что следует в своей области. Во-вторых, последовательность \catcode`^^M=12
. LaTeX присваивает каждой букве catcode: номер, который говорит, какой тип он есть. Например, обратная косая черта - catcode 0, конструктор имени команды; буквы - кодовый код 11; и символы небуквенной печати, такие как знак «знаком», являются кодовым кодом 12. Эта последовательность делает ^^M
, символ новой строки, имеет кодовый код 12, поэтому мы можем взаимодействовать с ним. Наконец, мы выписываем команду \[email protected]
, которая делает тяжелый подъем.
Далее мы определяем \[email protected]
. Мы делаем это внутри группы, где символ новой строки является кодом-кодом 12, так же как и будет расширяться \dialogueline
. Обратите внимание, что поэтому вы не можете сломать вторую строку с помощью новой строки —, это будет интерпретироваться как текст. Затем мы определяем \[email protected]
для принятия двух аргументов, заканчивающихся символом новой строки; он расширяется, беря первый аргумент (который вы передаете в фигурные скобки) и передаете его в качестве аргумента в среду dialogue
и передаете второй аргумент (все после первого и до конца строки) в качестве тела среды. Наконец, \[email protected]
завершает группу, открытую в \dialogueline
, так что изменение кодового кода ^^M
больше не видно. Учитывая это, вы можете написать
\dialogueline{Johnny} Some dialogue.
\dialogueline{Jane} I see.
и все должно работать.
В зависимости от того, какой редактор вы используете, вы также можете посмотреть в пакет сниппетов. – Mica
+1 Это действительно интересный вопрос – Geoff