Latex3: Задокументируйте коды для типа аргумента xparse "verbatim", задокументируйте, как воспроизвести \ verb

Созданный на 25 июн. 2020  ·  43Комментарии  ·  Источник: latex3/latex3

Когда fontenc загружается со своим параметром T1 , \NewDocumentCommand с дословным аргументом поглощает первый - если его содержимое содержит -- (независимо от используемых разделителей):

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xparse}
\NewDocumentCommand {\myverb} { v } {#1}
\begin{document}
\ttfamily
\verb|--all|

\myverb{-all}

\myverb{--all}

\myverb{---all}
\end{document}

image

bug documentation xparse

Самый полезный комментарий

Независимо от результата этого обсуждения, будет полезно задокументировать
xparse.pdf, как воспроизвести поведение глагола с помощью \ NewDocumentCommand.

Все 43 Комментарий

Вы видите лигатуру -- в шрифте пишущей машинки. Если вы напишете \texttt{--} вы также увидите одно тире, но если вы скопируете из PDF, вы увидите, что это действительно тире. Вы можете проверить это, передав полученный аргумент в \showtokens или используя \@noligs (LaTeX использует это в \verb чтобы получить -- print -- ):

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xparse}
\makeatletter
% \NewDocumentCommand {\myverb} { v } { \showtokens{#1} }
\NewDocumentCommand {\myverb} { v } {#1}
\begin{document}
\makeatletter
\ttfamily \<strong i="13">@noligs</strong>
-- and \verb|--all|

- and \myverb{-all}

-- and \myverb{--all}

--- and \myverb{---all}
\end{document}

test

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

Он просто захватывает дословно (дословно здесь означает некоторый эквивалент \let\do\<strong i="5">@makeother</strong> \dospecials ). \@noligs можно добавить в настройку catcode для сканирования аргумента. С другой стороны, это будет вставлять активные токены там, где (теоретически) есть только токены catcode-other, поэтому в случае, если аргумент используется для чего-то другого, кроме набора, это может быть проблематичным.

Возможно, какой-то способ разрешить команде добавлять свои собственные настройки кода каталогов, например:

\NewDocumentCommand {\myverb} { v{\@noligs} } {#1}

@FrankMittelbach Я согласен с PhelypeOleinik в том, что «дословно» означает «дословно получать все, что написал пользователь». Лигатура <hyphen hyphen> с <endash> - это скорее «функция шрифта», чем «ошибка с захватом аргументов». Кроме того, \ttfamily не означает «моноширинный шрифт = без лигатуры». Некоторые моноширинные шрифты можно использовать в качестве основного текста (а не только кода), поэтому лигатуры дефиса в таких случаях не следует подавлять.

Но разве \NewDocumentCommand {\myverb} { v } {#1}\myverb{--all} должен вести себя как \verb|--all| ?

@dbitouze - не совсем. \ verb состоит из двух частей - получения аргументов и форматирования. Параметр «v» в \ NewDocumentCommand выполняет только первое.

@Phelype - если я чего-то не

\NewDocumentCommand {\myverb} { v } { {\<strong i="9">@noligs</strong> #1} }

В таком случае я не думаю, что это необходимо. Итак, возвращаясь к @dbitouze , способ репликации \ verb выглядит примерно так:

\ makeatletter
\ NewDocumentCommand {\ myverb} {v} {{\ @noligs \ ttfamily # 1}}
\ makeatother

Вт, 25 июн 2020 в 08:22, Денис Битузе [email protected]
написал:

Но не предполагается, что \ NewDocumentCommand {\ myverb} {v} {# 1} \ myverb {- all}
вести себя как \ verb | --all |?

-

Не совсем так, поскольку v - это просто синтаксический анализ аргумента, и это читается
дословно, глагол также набирает содержимое нестандартным моноширинным шрифтом
установка, которая подавляет лигатуры.
поэтому вместо того, чтобы просто #1 набрать аргумент текущим шрифтом, вы должны
нужно сделать

\verbatim@font\<strong i="19">@noligs</strong>
\language\l<strong i="20">@nohyphenation</strong>

за исключением того, что \ @noligs требует
\ defverbatim @ nolig @ list {\ do` \ do \ <\ do> \ do \, \ do \ '\ do-}
чтобы они были активными, поэтому мы могли бы рассмотреть возможность либо сделать их активными с помощью v. или
обеспечение оболочки вокруг скан-токенов, которая обеспечивает возможность работы \
здесь

Вы получаете это, потому что подписаны на эту беседу.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/latex3/latex3/issues/756#issuecomment-649302149 или
отказаться от подписки
https://github.com/notifications/unsubscribe-auth/AAJVYAVLBB4ABB3DD5TETRDRYL3MPANCNFSM4OHMH74A
.

@dbitouze нет, сходство заключается только в том, как аргумент может быть разделен: вы можете использовать \ myverb! abc !. Результат документируется как

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

Парсер аргументов только читает аргумент, но не набирает его. И было бы бессмысленно добавлять к нему команды шрифта или другие команды или даже предварительно обрабатывать его для применения \@noligs по умолчанию: есть и другие способы подавления лигатур. С luatex можно было бы применить, возможно, Ligatures=Resetall а с pdflatex можно было бы использовать \pdfnoligatures с немного другим шрифтом:

~~~~
\ RequirePackage {fix-cm}
\ documentclass {статья}
\ usepackage [T1] {fontenc}
\ usepackage {xfp, xparse}

\ makeatletter
\ NewDocumentCommand {\ myverb} {v} {{\ fontsize {\ fpeval {\ f@size+0.0001 }} {\ normalbaselineskip} \ selectfont \ pdfnoligatures \ font # 1}}
\ makeatother

\ begin {document}
--все

глагол | --all |

\ myverb {-all}

\ myverb {- все}

\ myverb {--- все}

\ footnotesize
--all \ myverb {- все}

\ ttfamily
--все

глагол | --all |

\ myverb {-all}

\ myverb {- все}

\ myverb {--- все}

\ footnotesize
--all \ myverb {- все}

\ конец {документ}
~~~~

@phelype - если я чего-то не
\ NewDocumentCommand {\ myverb} {v} {{\ @noligs # 1}}

@wspr Вроде , но нет: \@noligs изменяет catcode - (и еще несколько) на 13, а затем определяет его как \def-{\leavevmode\kern\z@\char`-} : изменение кода cat, это должно быть сделано до того, как аргумент будет захвачен (если мы не рассматриваем \scantokens ), поэтому я предлагаю разрешить аргумент «установка кода» для v (хотя он должен быть необязательным: \NewDocumentCommand {\myverb} { v[\@noligs] } {#1} ).

Спасибо @phelype - я давно не заглядывал в этот макрос :)
В этом случае мне нравится идея аргумента установки ... даже если в этом случае другие подходы также могут работать, чтобы отключить лигатуры.

У нас нет дополнительных данных в спецификации arg, поэтому потребуется новая буква ( w ?)

Или критическое изменение типа v

Я бы предпочел проголосовать за V (соответствует тому, что у нас есть o, O, d и D), чем рассматривать критическое изменение.

У нас нет дополнительных данных в спецификации arg, поэтому потребуется новая буква ( w ?)

Разве мы не можем добавить?

Или, возможно, поскольку у нас есть o и O{} , кажется естественным иметь v и V{} . Конечно, спор означал бы разные вещи ...

Imho, если коды каталогов должны быть настроены для v-типа, имеет смысл использовать код cctab, а не какую-то произвольную команду, например \@noligs . Тогда чтение команды установит только коды каталогов, а определения активных символов должны быть выполнены в теле макроса.

@ u-fischer Так мне лучше получить этот пиар за l3cctab в ...

В настоящее время я не знаю, как работает l3cctab и как это может быть полезно для решения текущей проблемы, но мне это очень интересно :)

Моя точка зрения заключалась в том, что семантически v является "дословным", тогда как то, что здесь нужно, - нет. Важно отметить, что вы должны беспокоиться, если ограничивающие символы изменены таблицей catcode или чем-то еще. Кроме того, мы были последовательны, что прописные буквы -> вариант строчных букв с необязательным аргументом. Поэтому я бы сказал, что что-то вроде c{<table>} (= 'catcode') было бы правильным.

Я разберу все cctab сегодня или завтра, если смогу, чтобы мы могли обсудить.

@dbitouze Таблица catcode - это способ иметь «фиксированный» набор catcode для всех символов (*). Это означает, что вы получаете интерфейс с одним токеном для изменений, поэтому ' \c_document_cctab для обычных кат-кодов, \c_initex_cctab для IniTeX и т. Д. Идея в том, что это намного яснее и надежнее, чем одно- по одной настройке.

  • В XeTeX у нас нет необходимого примитива, поэтому я могу охватить только символы от 0 до 255 с разумной производительностью.

@josephwright (не по теме) Мне кажется, вы хотели добавить сноску, но Markdown этого не знал.

Подавление известного набора лигатур во время вывода также можно выполнить, используя \tl_replace_all:Nnn и заменив проблемный символ чем-то, что не образует лигатуру.

@Skillmon Хороший момент: можно взять дословный материал и заменить токены. Поскольку все строго дословно, это, вероятно, более простой подход, чем беспокоиться о настройке catcode.

Независимо от результата этого обсуждения, будет полезно задокументировать
xparse.pdf, как воспроизвести поведение глагола с помощью \ NewDocumentCommand.

@josephwright в зависимости от количества заменяемых токенов производительность будет намного хуже при подходе \tl_replace_all:Nnn .

Кроме того, как узнать, какие символы (очень крупного шрифта) нужно заменить?

Далее: что означает набор «дословно моноширинным шрифтом» для многих шрифтов (неевропейских)?

@ car222222 в очень большом шрифте вы получили функции шрифта как единственный разумный способ подавить их все, LaTeX не может знать обо всех лигатурах, возможных в шрифте. Но, по крайней мере, символы, поддерживаемые LaTeX2e, могут быть легко покрыты (это просто \tl_map_function:NN и \tl_replace_all:Nnn ).

Далее: AFAIK есть символы с двойным интервалом в некоторых моноширинных шрифтах для некоторых неевропейских шрифтов.

Я бы посоветовал просто обернуть каждый символ в hbox. Вроде работает
достаточно хорошо, но я не тестировал подробно.

\ RequirePackage {xparse}
\ ExplSyntaxOn
\ NewDocumentCommand {\ myverb} {v} {\ texttt {\ str_map_ function: nN {# 1} \ hbox: n }}
\ ExplSyntaxOff
\ documentclass {статья}
\ usepackage [T1] {fontenc}
\ begin {document}
глагол | a - b --- c `` <'' |

\ myverb | a - b --- c `` <'' |
\ конец {документ}

Я бы посоветовал просто обернуть каждый символ в hbox. Кажется, он работает достаточно хорошо, но я не тестировал подробно.

Попробуйте с |a--bgrüße ---c ``<''|

Хорошо, вторая попытка ( v arg сохраняет активные символы как есть): вставьте \kern 0pt\relax перед всеми неактивными символами.

\RequirePackage{xparse}
\ExplSyntaxOn
\tl_new:N \l__myverb_tl
\cs_new:Npn \__myverb:n #1
  {
    \token_if_active:NF #1 { \kern 0pt\relax }
    \exp_not:n {#1}
  }
\NewDocumentCommand { \myverb } { v }
  {
    \tl_set:Nn \l__myverb_tl {#1}
    \tl_replace_all:Nnn \l__myverb_tl { ~ } { { ~ } }
    \group_begin:
      \use:c { verbatim<strong i="8">@font</strong> }
      \use:x { \tl_map_function:NN \l__myverb_tl \__myverb:n }
    \group_end:
  }
\ExplSyntaxOff
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\begin{document}
\verb|a--bgrüße ----c ``<''|

\myverb|a--bgrüße ----c ``<''|
\end{document}

Хорошо, вторая попытка ( v arg сохраняет активные символы как есть):

Но не все. Например, цитата здесь неактивна:

~~~~
\ documentclass {статья}
\ usepackage [ngerman] {babel}
\ begin {document}

\ ExplSyntaxOn
\ NewDocumentCommand {\ myverb} {mv}
{
\ tl_analysis_ show: n {# 1}
\ tl_analysis_ show: n {# 2}
}
\ ExplSyntaxOff

\ myverb {"a} |" a |
\ конец {документ}
~~~~

дает

~~~~
Список токенов содержит токены:

"(активный символ = макрос: -> активный @ префикс " активный @ символ ")
а (буква а).
}

l.29 \ myverb {"a} |" a |

?
Список токенов содержит токены:

" (характер ")
а (символ а).
}
~~~~

@ u-fischer, но какой из этих двух результатов нужен в «дословном тексте»?

«Неактивный» случай мне кажется похожим на то, что LaTeX имел в виду под словом «дословно».

Но, возможно, некоторые люди ожидают, что результат будет, например, ä, который не очень похож на «дословно» для других.

Как я уже много раз писал: что означает слово «дословно» за пределами печатаемого 7-битного ASCII?

@ car222222 мой пример касается ввода, а не вывода. Я ничего не выводю, а только анализирую, как выглядит аргумент, полученный xparse. Из документации я ожидал, что аргумент позволит активным символам такими, какие они есть, и преобразовать все другие токены в catcode 12, а пробелы в catcode 10. Но, как показывают некоторые тесты, мое ожидание было неверным: активные символы, настроенные с помощью babel, также преобразуются в catcode 12 поскольку синтаксический анализатор аргументов содержит файл \ dospecial.

Еще один вопрос: должен ли этот аргумент типа v сворачивать последовательные пробелы в один токен (с кодом 10) или сохранять количество пробелов «дословно»? Насколько «дословно» это должно быть (я не думаю, что сейчас это четко определено в руководстве)?

@ u-fischer Ввод / вывод ?? Но вы ответили на мой подразумеваемый вопрос.

Вы хотите оставить активным, «но я думаю, что дословно должно производиться неактивное», чтобы не мог выводиться глиф ä.

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

Может быть, эту концепцию + определения нужно изменить, но на что именно?

Или, как выразился @ RuixiZhang42 : насколько дословно 21-й век дословно?

Интересно глагол * | YZ | (с двумя последовательными вкладками) дает один пробел
потому что глагол изменяет код пробела, но не табуляции.

Я согласен, что аргумент v-типа (и "+ v" тоже) сейчас не совсем четко определен. Будет ли
следующее имеет смысл, используя таблицу кат-кода?

  • Дайте catcode 13 (активный) пробелам и нескольким другим (например, `\ ^^ M?).

  • Дайте catcode 12 (другой) всем остальным байтам 0-127 (в pdfTeX), 0-255 (в XeTeX,
    upTeX, pTeX) или 0-1114111 (LuaTeX).

  • В pdfTeX укажите код каталогов 13 (активный) для байтов 128–255.

Может, лучше оставить что-нибудь как catcode 11 (буквы)?

Вы хотите, чтобы активный "

Нет, я этого не говорил. Я только написал, что ожидал этого, после прочтения документации. Это только означает, что документация нуждается в улучшении.

но я думаю, что дословно должно выводиться неактивное «так, чтобы не мог выводиться глиф ä.

Вы можете получить "a качестве вывода также с активным " : вам нужно только дать ему подходящее определение локально.

@ u-fischer Вы можете получить "a as output также с активным"

Конечно, но я не знаю, нужна ли такая настройка для «дословного режима»? Может стоит?

Вернемся к вопросу: что означает слово «дословно» как для чтения списка входных токенов, так и для вывода (включая какой шрифт, с какими лигатурами, кернинг, другие особенности шрифта и т. Д. И т. Д.).

Может быть, что-то вроде этого (только для ввода печатаемого ASCII):
ни один символ не удаляется или код символа не изменяется, код большинства становится 12, за исключением следующих, которые изменены на (или сохранены на) 13,. . . .
Плюс следующие непечатаемые ascii, которые также стали токенами catcode 13:. . .

Среда должна быть настроена для работы с выводом (текстовым представлением) любого 7-битного символа ACSII, который в результате вышеупомянутого процесса может оказаться внутренне токеном catcode 13.

[Немного отличается от оригинала, но, как и оригинал, охватывает только ввод ASCII.]

@blefloch писал (а): В pdfTeX укажите код 13 (активный) для байтов 128–255.

Вы бы сделали это, даже если inputenc не используется? Какое определение вы бы им дали?

Я не уверен, задумывался ли кто-нибудь о вводе utf-8 inputenc в дословный режим. Будет ли это поддерживаться и что это значит?

Я не уверен, задумывался ли кто-нибудь о вводе utf-8 inputenc в дословный режим. Будет ли это поддерживаться и что это значит?

Поддерживается, по крайней мере, для кодирования T1. Для греческого или аналогичного вам придется переопределить дословный @ font :

~~~
\ documentclass {статья}
\ usepackage [LGR, T1] {fontenc}
\ begin {document}
глагол | grüße € |

\ makeatletter
\ defverbatim @ font {\ ttfamily}
fontencoding {LGR} \ selectfont
глагол | Γειά σου Κόσμε |
\ конец {документ}
~~~

image

Возможные предложения относительно того, что должно делать дословное объяснение. Я склоняюсь к варианту 1, но, возможно, мне не хватает некоторых аспектов.

  1. Обновите коды каталогов от 0 до 255 (в любом движке), оставив неизменными коды каталогов 11, 12, 13 (буква / другое / активный), изменив код каталогов 10 (пробел) на код каталогов 13 (активный), а все остальные коды - 12 (другие) . Затем примените изменения кода каталогов в \@noligs , а именно сделайте элементы \verbatim@nolig@list активными. Затем возьмите аргумент: это дает результат только с кодами 11, 12, 13. Легко преобразовать обратно в строку для пользователей, которым не нужны активные символы. Для тех, кому нужна поддержка inputenc или babel-стенографии, все активные символы были сохранены. Он также поддерживает подавление лигатуры.

  2. Используйте таблицу кодов каталогов \l_xparse_verbatim_cctab которая может быть изменена пользователем. Это сложно синхронизировать с ярлыками babel, которые могут изменить середину документа. Это также неудобно для автора пакетов, поскольку им нужна функция-оболочка, которая изменяет \l_xparse_verbatim_cctab перед синтаксическим анализом дословного аргумента.

  3. Вариант 2. где cctab задается как аргумент v (необязательный аргумент или новая буква). Опять же, это не может быть синхронизировано с сокращениями babel и изменениями в \verbatim@nolig@list .

Была ли эта страница полезной?
0 / 5 - 0 рейтинги