Когда 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}
Вы видите лигатуру --
в шрифте пишущей машинки. Если вы напишете \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}
но 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 и т. Д. Идея в том, что это намного яснее и надежнее, чем одно- по одной настройке.
@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
глагол | Γειά σου Κόσμε |
\ конец {документ}
~~~
Возможные предложения относительно того, что должно делать дословное объяснение. Я склоняюсь к варианту 1, но, возможно, мне не хватает некоторых аспектов.
Обновите коды каталогов от 0 до 255 (в любом движке), оставив неизменными коды каталогов 11, 12, 13 (буква / другое / активный), изменив код каталогов 10 (пробел) на код каталогов 13 (активный), а все остальные коды - 12 (другие) . Затем примените изменения кода каталогов в \@noligs
, а именно сделайте элементы \verbatim@nolig@list
активными. Затем возьмите аргумент: это дает результат только с кодами 11, 12, 13. Легко преобразовать обратно в строку для пользователей, которым не нужны активные символы. Для тех, кому нужна поддержка inputenc или babel-стенографии, все активные символы были сохранены. Он также поддерживает подавление лигатуры.
Используйте таблицу кодов каталогов \l_xparse_verbatim_cctab
которая может быть изменена пользователем. Это сложно синхронизировать с ярлыками babel, которые могут изменить середину документа. Это также неудобно для автора пакетов, поскольку им нужна функция-оболочка, которая изменяет \l_xparse_verbatim_cctab
перед синтаксическим анализом дословного аргумента.
Вариант 2. где cctab задается как аргумент v
(необязательный аргумент или новая буква). Опять же, это не может быть синхронизировано с сокращениями babel и изменениями в \verbatim@nolig@list
.
Самый полезный комментарий
Независимо от результата этого обсуждения, будет полезно задокументировать
xparse.pdf, как воспроизвести поведение глагола с помощью \ NewDocumentCommand.