Latex3: Dokumentieren Sie Catcodes für den Argumenttyp "wörtlich" von xparse, dokumentieren Sie, wie \verb . reproduziert wird

Erstellt am 25. Juni 2020  ·  43Kommentare  ·  Quelle: latex3/latex3

Wenn fontenc mit seiner Option T1 geladen wird, verschlingt \NewDocumentCommand mit wörtlichem Argument das erste - wenn sein Inhalt ein -- (unabhängig der verwendeten Trennzeichen):

\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

Hilfreichster Kommentar

Unabhängig vom Ergebnis dieser Diskussion wird es nützlich sein, in
xparse.pdf wie man das Verhalten des Verbs mit \NewDocumentCommand reproduziert.

Alle 43 Kommentare

Was Sie sehen, ist die Ligatur -- in der Schreibmaschinenschrift. Wenn Sie \texttt{--} schreiben, sehen Sie auch einen einzelnen Gedankenstrich, aber wenn Sie aus der PDF-Datei kopieren, sehen Sie, dass es sich tatsächlich um einen Gedankenstrich handelt. Sie können dies überprüfen, indem Sie das gegriffene Argument an \showtokens oder indem Sie \@noligs (LaTeX verwendet das in \verb , um -- -- drucken

\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

aber v in xparse soll wörtlich sein (oder nicht?)

Es greift einfach wörtlich (wörtlich hier ist ein Äquivalent von \let\do\<strong i="5">@makeother</strong> \dospecials ). \@noligs könnte im Catcode-Setup hinzugefügt werden, um das Argument zu scannen. Auf der anderen Seite würde dies aktive Token einfügen, wo es (theoretisch) nur Catcode-andere Token gibt. Wenn das Argument also für etwas anderes als den Schriftsatz verwendet wird, könnte dies problematisch sein.

Vielleicht eine Möglichkeit, dem Befehl zu erlauben, seine eigenen Catcode-Einstellungen hinzuzufügen, wie zum Beispiel:

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

@FrankMittelbach Ich stimme PhelypeOleinik zu, dass "wörtlich" bedeutet "greifen Sie, was immer der Benutzer wörtlich geschrieben hat". Die Ligatur <hyphen hyphen> bis <endash> ist eher ein „Schriftfeature“ als ein „argument-grabbing bug“. Außerdem bedeutet \ttfamily nicht „monospaced font = keine Ligatur“. Einige Schriftarten mit Monospace können als Textkörper verwendet werden (nicht nur Code), daher sollten die Bindestrich-Ligaturen in solchen Fällen nicht unterdrückt werden.

Aber sollte sich \NewDocumentCommand {\myverb} { v } {#1}\myverb{--all} wie \verb|--all| verhalten?

@dbitouze – nicht wirklich. \verb hat zwei Teile – das Erfassen von Argumenten und das Formatieren. Die Einstellung „v“ in \NewDocumentCommand macht nur Ersteres.

@Phelype – es sei denn, ich vermisse etwas, tut Ihr Vorschlag nicht mehr als das?:

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

In diesem Fall halte ich es nicht für notwendig. Also zurück zu @dbitouze , der Weg zum Replizieren von \verb ist etwa so:

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

Am Do, 25 Jun 2020 at 08:22, Denis Bitouzé [email protected]
schrieb:

Aber ist \NewDocumentCommand {\myverb} { v } {#1}\myverb{--all} nicht gedacht
sich wie \verb|--all| verhalten?

Nicht ganz, denn bei v geht es nur um das Parsen des Arguments, und das wird gelesen
wörtlich, Verb setzt den Inhalt auch in einer nicht standardmäßigen Monospace-Schriftart
Setup, das Ligaturen unterdrückt.
also anstatt nur #1 , um das Argument in der aktuellen Schriftart zu setzen, die Sie
tun müssen

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

außer dass \ @noligs erfordert
\ defverbatim@nolig@list {\do`\do\<\do>\do\,\do\'\do-}
aktiv zu sein, also könnten wir erwägen, diese entweder als aktiv zu setzen. oder
Bereitstellung eines Wrappers um Scantokens, der dafür sorgt, dass \ @noligs funktionieren kann
Hier

Sie erhalten dies, weil Sie diesen Thread abonniert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/latex3/latex3/issues/756#issuecomment-649302149 oder
Abmelden
https://github.com/notifications/unsubscribe-auth/AAJVYAVLBB4ABB3DD5TETRDRYL3MPANCNFSM4OHMH74A
.

@dbitouze nein, die Ähnlichkeit besteht nur darin, wie das Argument abgegrenzt werden kann: Sie können \myverb!abc! verwenden. Das Ergebnis wird dokumentiert als

was dazu führt, dass das erfasste Argument aus Tokens der Kategoriecodes 12 („andere“) und 13 („aktiv“) besteht, mit Ausnahme von Leerzeichen, denen der Kategoriecode 10 („Leerzeichen“) gegeben wird.

Der Argumentparser liest nur ein Argument, er setzt es nicht. Und es würde keinen Sinn machen, Schriftartbefehle oder andere Befehle hinzuzufügen oder es sogar vorzuverarbeiten, um standardmäßig \@noligs anzuwenden: Es gibt andere Möglichkeiten, Ligaturen zu unterdrücken. Bei luatex würde man vielleicht Ligatures=Resetall anwenden und bei pdflatex könnte man \pdfnoligatures mit einer etwas anderen Schriftart verwenden:

~~~~
\RequirePackage{fix-cm}
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xfp,xparse}

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

\begin{Dokument}
--alle

Verb|--alle|

\myverb{-all}

\myverb{--all}

\myverb{---alle}

\footnotesize
--all \myverb{--all}

\ttfamilie
--alle

Verb|--alle|

\myverb{-all}

\myverb{--all}

\myverb{---alle}

\footnotesize
--all \myverb{--all}

\end{Dokument}
~~~~

@phelype – es sei denn, ich vermisse etwas, tut Ihr Vorschlag nicht mehr als das?:
\NewDocumentCommand {\myverb} { v } { {\ @noligs #1} }

@wspr Irgendwie, aber nein: \@noligs ändert den Catcode von - (und ein paar anderen) auf 13 und definiert ihn dann als \def-{\leavevmode\kern\z@\char`-} : eine Catcode-Änderung, es muss getan werden, bevor das Argument erfasst wird (es sei denn, wir ziehen \scantokens in Betracht), daher mein Vorschlag, ein "catcode setup"-Argument für v zuzulassen (obwohl es optional sein müsste: \NewDocumentCommand {\myverb} { v[\@noligs] } {#1} ).

Danke @phelype – es ist schon eine Weile her, dass ich in dieses Makro geschaut habe :)
In diesem Fall gefällt mir die Idee des Setup-Arguments… auch wenn in diesem Fall auch andere Ansätze funktionieren können, um die Ligaturen zu deaktivieren.

Wir haben keine optionalen Daten in der arg-Spezifikation, daher bräuchte es einen neuen Buchstaben ( w ?)

Oder eine Breaking Change zu v -type

Ich würde eher für V stimmen (was dazu passt, dass wir o und O und d und D haben), als eine Breaking Change in Betracht zu ziehen.

Wir haben keine optionalen Daten in der arg-Spezifikation, daher bräuchte es einen neuen Buchstaben ( w ?)

Können wir nicht einen hinzufügen?

Oder vielleicht, da wir o und O{} , scheint es natürlich, v und V{} . Natürlich würde das Argument verschiedene Dinge bedeuten...

Imho, wenn die Catcodes für den V-Typ anpassbar sein sollen, wäre es sinnvoll, den cctab-Code zu verwenden und nicht irgendeinen beliebigen Befehl wie \@noligs . Dann würde das Lesen des Befehls nur die Catcodes setzen und die Definitionen der aktiven Zeichen sollten dann im Makrokörper erfolgen.

@u-fischer Also bekomme ich diese PR besser für l3cctab in ...

Derzeit habe ich keine Ahnung, wie l3cctab funktioniert und wie es für das aktuelle Problem hilfreich sein könnte, aber ich bin wirklich interessiert :)

Mein Punkt war, dass v semantisch "wörtlich" ist, was hier jedoch nicht benötigt wird. Wichtig ist, dass Sie sich Sorgen machen müssen, wenn die Trennzeichen durch die Catcode-Tabelle oder was auch immer geändert werden. Außerdem haben wir konsequent darauf geachtet, dass Großbuchstaben -> einige optionale Argumente von Kleinbuchstaben sind. Also würde ich sagen, dass etwas wie c{<table>} (= 'Katcode') richtig wäre.

Ich werde das cctab Zeug heute oder morgen sortieren, wenn ich kann, damit wir diskutieren können.

@dbitouze Eine Catcode-Tabelle ist eine Möglichkeit, einen 'festen' Satz von Catcode für alle Zeichen(*) zu haben. Es bedeutet, dass Sie eine One-Token-Schnittstelle für die Änderungen erhalten, also ' \c_document_cctab für normale Catcodes, \c_initex_cctab für IniTeX usw. Die Idee ist, dass dies viel klarer und zuverlässiger ist als eine- um eine Einstellung.

  • In XeTeX haben wir nicht das notwendige Primitiv, daher kann ich nur die Zeichen 0 bis 255 mit angemessener Leistung abdecken.

@josephwright (off topic) Es scheint mir, dass Sie eine Fußnote hinzufügen wollten, aber Markdown wusste das nicht.

Das Unterdrücken eines bekannten Satzes von Ligaturen während der Ausgabe kann auch erfolgen, indem Sie \tl_replace_all:Nnn und das problematische Zeichen durch etwas ersetzen, das die Ligatur nicht bildet.

@Skillmon Guter Punkt: Man könnte das wörtliche Material nehmen und Token ersetzen. Da alles streng wörtlich ist, ist dies wahrscheinlich ein einfacherer Ansatz, als sich um die Einrichtung des Catcodes zu kümmern.

Unabhängig vom Ergebnis dieser Diskussion wird es nützlich sein, in
xparse.pdf wie man das Verhalten des Verbs mit \NewDocumentCommand reproduziert.

@josephwright Abhängig von der Anzahl der zu ersetzenden Token wird die Leistung mit dem \tl_replace_all:Nnn Ansatz viel schlechter.

Und woher wissen Sie, welche Zeichen (in einer sehr großen Schriftart) ersetzt werden müssen?

Außerdem: Was bedeutet das Setzen von 'wörtlich mit einer monospaced Schriftart' für viele Schriften (nicht-europäisch)?

@car222222 in einer sehr großen Schrift haben Sie die Schriftfunktionen als einzige vernünftige Möglichkeit, sie alle zu unterdrücken, LaTeX kann nicht alle in einer Schrift möglichen Ligaturen kennen. Aber zumindest die von LaTeX2e unterstützten Zeichen könnten leicht abgedeckt werden (es ist nur ein \tl_map_function:NN und \tl_replace_all:Nnn ).

Weiter: AFAIK gibt es in einigen monospaced Schriftarten für einige nichteuropäische Schriften doppelte Zeichen.

Ich würde vorschlagen, einfach jedes Zeichen in eine Hbox zu packen. Es scheint zu funktionieren
einigermaßen gut, aber ich habe nicht ausgiebig getestet.

\RequirePackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\myverb}{v}{\texttt{\str_map_ function:nN {#1}\ hbox:n }}
\ExplSyntaxOff
\documentclass{article}
\usepackage[T1]{fontenc}
\begin{Dokument}
Verb|a--b ---c ``<''|

\myverb|a--b ---c ``<''|
\end{Dokument}

Ich würde vorschlagen, einfach jedes Zeichen in eine Hbox zu packen. Es scheint recht gut zu funktionieren, aber ich habe nicht ausführlich getestet.

Versuchen Sie es mit |a--bgrüße ---c ``<''|

Ok, zweiter Versuch (das Argument v behält aktive Zeichen bei: Fügen Sie \kern 0pt\relax vor allen nicht aktiven Zeichen ein.

\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}

Ok, zweiter Versuch (das Argument v behält aktive Zeichen unverändert bei):

Aber nicht jeder. ZB ist das Zitat hier nicht aktiv:

~~~~
\documentclass{article}
\usepackage[deutsch]{babel}
\begin{Dokument}
"ein

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

\myverb{"a}|"a|
\end{Dokument}
~~~~

gibt

~~~~
Die Tokenliste enthält die Token:

" (aktives Zeichen=Makro:->aktives @prefix "active@char" )
a (der Buchstabe a).
}

1.29 \myverb{"a}|"a|

?
Die Tokenliste enthält die Token:

" (der Charakter ")
a (das Zeichen a).
}
~~~~

@u-fischer aber welche dieser beiden Ausgaben möchte man im 'wörtlichen Text'?

Der Fall "Nicht aktiv" sieht für mich aus wie das, was LaTeX früher mit "wörtlich" meinte.

Aber vielleicht erwarten manche Leute, dass die Ausgabe zum Beispiel so ist, dass sie für andere nicht wortwörtlich aussieht.

Wie ich schon so oft geschrieben habe: Was bedeutet "wörtlich" außerhalb von druckbarem 7-Bit-ASCII?

@ car222222 In meinem Beispiel geht es um Eingabe, nicht um Ausgabe. Ich gebe nichts aus, sondern analysiere nur, wie das von xparse erfasste Argument aussieht. Aus der Dokumentation habe ich das Argument erwartet, aktive Zeichen unverändert zu lassen und alle anderen Token in Catcode 12 und Leerzeichen in Catcode 10 zu konvertieren. Aber wie einige Tests zeigen, war meine Erwartung falsch: Aktive Zeichen, die mit Babel eingerichtet wurden, werden auch in Catcode 12 konvertiert da das Argument Parser ein \dospecial enthält.

Eine andere Frage: Sollte dieses Argument vom Typ v aufeinanderfolgende Leerzeichen zu einem Token zusammenfassen (mit Catcode 10) oder die Anzahl der Leerzeichen „wörtlich“ beibehalten? Wie "wörtlich" sollte es sein (ich glaube nicht, dass es jetzt im Handbuch gut definiert ist)?

@u-fischer Eingabe/Ausgabe ?? Aber Sie haben meine implizierte Frage beantwortet.

Sie möchten das Aktive beibehalten, aber ich denke, dass wörtlich das Nicht-Aktive erzeugt werden sollte, damit keine ä-Glyphe ausgegeben werden kann.

Wenn ich „Ich denke“ sage, meine ich, dass dies das ist, was ich vom ursprünglichen (vor 40 Jahren) Konzept von „wörtlich“ in TeX/LaTeX erwarten würde.

Vielleicht müssen Konzept+Definitionen geändert werden, aber wozu genau?

Oder wie @RuixiZhang42 es ausdrückte: Wie wörtlich ist das 21. Jahrhundert wörtlich?

Interessanterweise Verb*|YZ| (mit zwei aufeinanderfolgenden Registerkarten) ergibt ein einzelnes Leerzeichen
weil verb ändert den catcode von space, aber nicht von tab.

Ich stimme zu, dass das Argument vom v-Typ (und auch "+v") im Moment nicht genau definiert ist. Würde das
folgendes sinnvoll, mit einer catcode-Tabelle?

  • Geben Sie Catcode 13 (aktiv) zu Leerzeichen und ein paar anderen (zum Beispiel `\^^M?).

  • Geben Sie Catcode 12 (andere) an alle anderen Bytes 0-127 (in pdfTeX), 0-255 (in XeTeX,
    upTeX, pTeX) oder 0-1114111 (LuaTeX).

  • Geben Sie in pdfTeX Catcode 13 (aktiv) zu den Bytes 128-255.

Vielleicht ist es besser, einige Sachen als Catcode 11 (Buchstaben) zu behalten?

Sie möchten aktiv bleiben“

Nein, das habe ich nicht gesagt. Ich habe nur geschrieben, dass ich damit gerechnet habe, nachdem ich die Dokumentation gelesen hatte. Dies bedeutet nur, dass die Dokumentation verbessert werden muss.

aber ich denke, dass wörtlich das nicht-aktive “ hervorbringen sollte, damit keine ä-Glyphe ausgegeben werden kann.

Sie können "a auch mit einem aktiven " "a als Ausgabe erhalten: Sie müssen es nur lokal mit einer passenden Definition versehen.

@u-fischer Du bekommst "a als Ausgang auch bei aktiver"

Sicher, aber ich weiß nicht, ob der "wörtliche Modus" eine solche Anpassung benötigen sollte? Vielleicht sollte es?

Zurück zur Frage: Was bedeutet "wörtlich" sowohl für das Lesen einer Eingabe-Token-Liste als auch für die Ausgabe (einschließlich welcher Schriftart, mit welchen Ligaturen, Kerning, anderen Schriftartfunktionen usw. usw.).

Vielleicht so etwas (nur für die Eingabe von druckbarem ASCII):
kein Zeichen entfernt oder Zeichencode geändert wird, Catcode der meisten wird 12, mit Ausnahme der folgenden, die in 13 geändert (oder beibehalten werden) . . . .
Plus die folgenden nicht druckbaren ASCII-Zeichen, die ebenfalls zu Catcode-13-Token werden: . . .

Die Umgebung muss angepasst werden, um mit der Ausgabe (Textdarstellung) jedes 7-Bit-ACSII-Zeichens umzugehen, das sich durch den obigen Prozess als intern als Catcode-13-Token herausstellen könnte.

[Ganz anders als das Original, deckt aber immer noch nur ASCII-Eingaben ab, wie das Original.]

@blefloch hat geschrieben: Geben Sie in pdfTeX Catcode 13 (aktiv) zu den Bytes 128-255.

Würden Sie dies auch tun, wenn inputenc nicht verwendet wird? Welche Definition würden Sie ihnen geben?

Ich bin mir nicht sicher, ob jemand viel über die Eingabe von utf-8 inputenc in den wörtlichen Modus nachgedacht hat. Wird dies unterstützt und was bedeutet das?

Ich bin mir nicht sicher, ob jemand viel über die Eingabe von utf-8 inputenc in den wörtlichen Modus nachgedacht hat. Wird dies unterstützt und was bedeutet das?

Es wird zumindest für die T1-Kodierung unterstützt. Für Griechisch oder ähnliches müssten Sie verbatim@font neu definieren:

~~~
\documentclass{article}
\usepackage[LGR,T1]{fontenc}
\begin{Dokument}
verb|grüße € |

\makeatletter
\ defverbatim@font {\ttfamily}
Schriftartencodierung{LGR}\selectfont
Verb|Γειά σου Κόσμε|
\end{Dokument}
~~~

image

Mögliche Vorschläge, was das wörtliche Argument bewirken soll. Ich tendiere zu Option 1, aber ich kann einige Aspekte übersehen.

  1. Catcodes von 0 auf 255 aktualisieren (in jeder Engine), Catcodes 11, 12, 13 (Buchstabe/andere/aktiv) unverändert lassen, Catcode 10 (Leerzeichen) in Catcode 13 (aktiv) ändern und alle anderen Catcodes in 12 (andere) . Wenden Sie dann die Catcode-Änderungen in \@noligs , d. h. Elemente von \verbatim@nolig@list aktiv zu machen. Dann greifen Sie nach dem Argument: Dies ergibt nur ein Ergebnis mit den Catcodes 11, 12, 13. Es ist einfach, für Benutzer, die keine aktiven Zeichen möchten, in eine Zeichenfolge zurückzuwandeln. Für diejenigen, die Inputenc- oder Babel-Shorthand-Unterstützung wünschen, wurden alle aktiven Zeichen beibehalten. Es unterstützt auch die Ligaturunterdrückung.

  2. Verwenden Sie eine Catcode-Tabelle \l_xparse_verbatim_cctab , die vom Benutzer geändert werden kann. Dies ist schwer mit Babel-Kurzbefehlen synchron zu halten, die sich mitten im Dokument ändern können. Es ist auch für den Paketschreiber unhandlich, da er eine Wrapper-Funktion benötigt, die \l_xparse_verbatim_cctab ändert, bevor das wörtliche Argument geparst wird.

  3. Variante von 2. wobei die cctab als Argument v (optionales Argument oder neuer Buchstabe) angegeben wird. Auch dies kann nicht mit Babel-Kurzschrift und Änderungen an der \verbatim@nolig@list synchron gehalten werden.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

dbitouze picture dbitouze  ·  3Kommentare

josephwright picture josephwright  ·  31Kommentare

EvanAad picture EvanAad  ·  49Kommentare

dbitouze picture dbitouze  ·  14Kommentare

dbitouze picture dbitouze  ·  4Kommentare