На самом деле вы можете получить именно то, что вы хотите:
\newcommand{\dialogueline}{\begingroup\catcode`\^^M=12 \dialogueline@EOL}
{\catcode`\^^M=12\gdef\dialogueline@EOL#1#2^^M{\begin{dialogue}{#1}#2\end{dialogue}\endgroup}}
Этот код должен быть \makeatletter
-защищен - либо окружен \makeatletter
/ \makeatother
( edit : это означает, что вы ставите \makeatletter
перед определение и \makeatother
после него) или в файле .sty
. Обратите внимание, что среда с именем dialogue
определяет команду с именем \dialogue
, поэтому вам нужно другое имя. Не меняйте форматирование!
То, как это работает, заключается в том, что \dialogueline
- это команда, которая не принимает аргументов, но расширяется до нескольких последовательностей. Во-первых, токен открытия группы, чтобы поместить все, что следует, в его собственную область. Во-вторых, последовательность \catcode`^^M=12
. LaTeX присваивает каждой букве catcode : число, указывающее, какой это тип. Например, обратная косая черта - это код 0, конструктор имени команды; буквы каток 11; и непечатаемые символы печати, такие как знак at, являются catcode 12. Эта последовательность делает ^^M
, символ новой строки, имеет catcode 12, поэтому мы можем взаимодействовать с ним. Наконец, мы выписываем команду \dialogueline@EOL
, которая выполняет тяжелую работу.
Далее мы определяем \dialogueline@EOL
. Мы делаем это в группе, где символ новой строки - это код 12, так же, как и в случае, когда \dialogueline
раскрывается. Обратите внимание, что именно поэтому вы не можете разбить вторую строку новой строкой & mdash; она будет интерпретирована как текст. Далее мы определяем \dialogueline@EOL
для двух аргументов, заканчивающихся символом новой строки; он расширяется, беря первый аргумент (который вы передаете в скобках) и передавая его в качестве аргумента в среду dialogue
, и передавая второй аргумент (все после первого и до конца строки) в качестве тела среды , Наконец, \dialogueline@EOL
завершает группу, открытую в \dialogueline
, так что изменение катод-кода ^^M
больше нигде не видно. Учитывая это, вы можете написать
\dialogueline{Johnny} Some dialogue.
\dialogueline{Jane} I see.
и все должно работать.