Latex3: Documenter les catcodes pour le type d'argument « verbatim » de xparse, documenter comment reproduire \verb

Créé le 25 juin 2020  ·  43Commentaires  ·  Source: latex3/latex3

Lorsque fontenc est chargé avec son option T1 , \NewDocumentCommand avec l'argument verbatim engloutit le premier - si son contenu contient un -- (indépendamment des délimiteurs utilisés):

\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

Commentaire le plus utile

Quel que soit le résultat de cette discussion, il sera utile de documenter en
xparse.pdf comment reproduire le comportement du verbe en utilisant \NewDocumentCommand.

Tous les 43 commentaires

Ce que vous voyez est la ligature -- dans la police de la machine à écrire. Si vous écrivez \texttt{--} vous verrez également un seul tiret, mais si vous copiez à partir du PDF, vous verrez qu'il s'agit bien d'un tiret de fin. Vous pouvez vérifier cela en alimentant l'argument saisi à \showtokens ou en utilisant \@noligs (LaTeX l'utilise dans \verb pour que -- imprime -- ):

\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

mais v dans xparse est censé être textuel (n'est-ce pas ?) et dans LaTeX, cela signifie machine à écrire avec des ligatures supprimées, donc v devrait le faire aussi à mon avis.

Il saisit juste textuellement (verbatim ici étant un équivalent de \let\do\<strong i="5">@makeother</strong> \dospecials ). \@noligs pourraient être ajoutés dans la configuration du catcode pour analyser l'argument. D'un autre côté, cela insérerait des jetons actifs là où (théoriquement) il n'y a que des jetons catcode-autres, donc si l'argument est utilisé pour autre chose que la composition, cela pourrait être problématique.

Peut-être un moyen d'autoriser la commande à ajouter ses propres paramètres de catcode, comme :

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

@FrankMittelbach Je suis d'accord avec PhelypeOleinik pour dire que « verbatim » signifie « saisir tout ce que l'utilisateur a écrit textuellement ». La ligature <hyphen hyphen> à <endash> est plus une « fonctionnalité de police » qu'un « bogue de saisie d'arguments ». De plus, \ttfamily ne signifie pas « police à espacement fixe = aucune ligature ». Certaines polices à espacement fixe peuvent être utilisées comme type de corps (pas seulement du code), de sorte que les ligatures de tiret ne doivent

Mais \NewDocumentCommand {\myverb} { v } {#1}\myverb{--all} n'est-il pas censé se comporter comme \verb|--all| ?

@dbitouze - pas vraiment. \verb a deux parties : la saisie d'arguments et le formatage. Le paramètre « v » dans \NewDocumentCommand ne fait que le premier.

@Phelype - à moins que quelque chose ne me manque, votre suggestion ne fait-elle pas plus que cela ? :

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

Dans ce cas, je ne pense pas que ce soit nécessaire. Donc, revenons à @dbitouze , la façon de répliquer \verb est quelque chose comme :

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

Le jeu. 25 juin 2020 à 08:22, Denis Bitouzé [email protected]
a écrit:

Mais n'est-ce pas \NewDocumentCommand {\myverb} { v } {#1}\myverb{--all} supposé
se comporter comme \verb|--all|?

-

Pas exactement, car v consiste simplement à analyser l'argument, et qui est lu
mot pour mot, le verbe compose également le contenu dans une police à espacement fixe non standard
configuration qui supprime les ligatures.
donc plutôt que de simplement #1 pour composer l'argument dans la police actuelle, vous
besoin de faire

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

sauf que \ @noligs nécessite
\ defverbatim@nolig@list {\do`\do\<\do>\do\,\do\'\do-}
être actif afin que nous puissions envisager soit de les définir comme actifs. ou
fournir un wrapper autour des scantokens qui fait que \ @noligs peut fonctionner
ici

Vous recevez ceci parce que vous êtes abonné à ce fil.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/latex3/latex3/issues/756#issuecomment-649302149 , ou
Se désabonner
https://github.com/notifications/unsubscribe-auth/AAJVYAVLBB4ABB3DD5TETRDRYL3MPANCNFSM4OHMH74A
.

@dbitouze non, la similitude réside uniquement dans la manière dont l'argument peut être délimité : vous pouvez utiliser \myverb!abc!. Le résultat est documenté comme

qui se traduira par l'argument saisi composé de jetons des codes de catégorie 12 ("autre") et 13 ("actif"), à l'exception des espaces, qui reçoivent le code de catégorie 10 ("espace").

L'analyseur d'arguments lit uniquement un argument, il ne le compose pas. Et cela n'aurait aucun sens d'y ajouter des commandes de police ou d'autres commandes ou même de le prétraiter pour appliquer \@noligs par défaut : Il existe d'autres moyens de supprimer les ligatures. Avec Luatex, on appliquerait peut-être Ligatures=Resetall et avec pdflatex on pourrait utiliser \pdfnoligatures avec une police légèrement différente :

~~~~
\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{document}
--tout

verbe|--tout|

\myverb{-all}

\myverb{--all}

\myverb{---all}

\footnotesize
--all \monverbe{--all}

\ttfamille
--tout

verbe|--tout|

\myverb{-all}

\myverb{--all}

\myverb{---all}

\footnotesize
--all \monverbe{--all}

\fin{document}
~~~~

@phelype - à moins que quelque chose ne me manque, votre suggestion ne fait-elle pas plus que cela ? :
\NewDocumentCommand {\myverb} { v } { {\ @noligs #1} }

@wspr En quelque sorte, mais non : \@noligs change le catcode de - (et un tas d'autres) à 13, puis le définit comme \def-{\leavevmode\kern\z@\char`-} : étant un changement de catcode, cela doit être fait avant que l'argument ne soit saisi (à moins que nous ne considérions \scantokens ), d'où ma suggestion d'autoriser un argument "catcode setup" à v (bien que cela doive être facultatif : \NewDocumentCommand {\myverb} { v[\@noligs] } {#1} ).

Merci @phelype — ça fait un moment que je n'ai pas regardé à l'intérieur de cette macro :)
Dans ce cas, j'aime l'idée de l'argument setup… même si dans ce cas d'autres approches peuvent également fonctionner pour désactiver les ligatures.

Nous n'avons pas de données facultatives dans la spécification arg, il faudrait donc une nouvelle lettre ( w ?)

Ou une modification radicale du type v

Je préférerais voter pour V (correspondant au fait que nous avons o et O et d et D) plutôt que d'envisager un changement décisif.

Nous n'avons pas de données facultatives dans la spécification arg, il faudrait donc une nouvelle lettre ( w ?)

On ne peut pas en ajouter un ?

Ou peut-être, puisque nous avons o et O{} , il semble naturel d'avoir v et V{} . Bien sûr, l'argument signifierait différentes choses...

À mon humble avis, si les catcodes devaient être personnalisables pour le type v, il serait logique d'utiliser le code cctab, et non une commande arbitraire comme \@noligs . Ensuite, la lecture de la commande ne définirait que les catcodes et les définitions des caractères actifs devraient alors être effectuées dans le corps de la macro.

@u-fischer Donc je ferais mieux d'obtenir ce PR pour l3cctab en ...

Actuellement, je n'ai aucune idée du fonctionnement de l3cctab et de la façon dont cela pourrait être utile pour le problème actuel, mais je suis vraiment intéressé :)

Mon point était que sémantiquement v est « mot pour mot » alors que ce qui est nécessaire ici ne l'est pas. Surtout, vous devez vous inquiéter si les caractères de délimitation sont modifiés par la table de catcode ou autre. De plus, nous avons été cohérents avec les lettres majuscules -> une variante d'argument facultatif d'une minuscule. Donc, je dirais que quelque chose comme c{<table>} (= 'catcode') serait correct.

Je vais faire trier les trucs de cctab aujourd'hui ou demain si je peux, afin que nous puissions discuter.

@dbitouze Une table de catcode est un moyen d'avoir un ensemble "fixe" de catcode pour tous les caractères (*). Cela signifie que vous obtenez une interface à un jeton pour les modifications, donc ' \c_document_cctab pour les catcodes normaux, \c_initex_cctab pour IniTeX, etc. L'idée est que c'est beaucoup plus clair et plus fiable qu'un- réglage par un.

  • Dans XeTeX, nous n'avons pas la primitive nécessaire, je ne peux donc couvrir que les caractères 0 à 255 avec des performances raisonnables.

@josephwright (hors sujet) Il me semble que vous vouliez ajouter une note de bas de page mais Markdown ne le savait pas.

La suppression d'un ensemble connu de ligatures lors de la sortie peut également être effectuée en utilisant \tl_replace_all:Nnn et en remplaçant le caractère problématique par quelque chose qui ne formera pas la ligature.

@Skillmon Bon point : on pourrait prendre le verbatim et remplacer les jetons. Comme tout est strictement textuel, c'est probablement une approche plus facile que de s'inquiéter de la configuration du catcode.

Quel que soit le résultat de cette discussion, il sera utile de documenter en
xparse.pdf comment reproduire le comportement du verbe en utilisant \NewDocumentCommand.

@josephwright en fonction du nombre de jetons à remplacer, les performances seront bien pires avec l'approche \tl_replace_all:Nnn .

De plus, comment saurez-vous quels caractères (dans une très grande police) doivent être remplacés ?

De plus : que signifie la composition « verbatim avec une police à espacement fixe » pour de nombreux scripts (non européens) ?

@ car222222 dans une très grande police, vous avez les fonctionnalités de police comme seul moyen raisonnable de les supprimer toutes, LaTeX ne peut pas connaître toutes les ligatures possibles dans une police. Mais au moins les caractères pris en charge par LaTeX2e pourraient être facilement couverts (c'est juste un \tl_map_function:NN et un \tl_replace_all:Nnn ).

De plus : AFAIK, il existe des symboles à double interligne dans certaines polices à espacement fixe pour certains scripts non européens.

Je suggérerais simplement d'envelopper chaque caractère dans une hbox. ça a l'air de marcher
assez bien, mais je n'ai pas fait de tests approfondis.

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

\myverb|a--b ---c ``<''|
\fin{document}

Je suggérerais simplement d'envelopper chaque caractère dans une hbox. Cela semble fonctionner assez bien, mais je n'ai pas fait de tests approfondis.

Essayez avec |a--bgrüße ---c ``<''|

Ok, deuxième tentative (l'argument v conserve les caractères actifs tels quels) : insérez \kern 0pt\relax avant tous les caractères non actifs.

\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, deuxième tentative (l'argument v conserve les caractères actifs tels quels) :

Mais pas tout le monde. Par exemple, la citation ici n'est pas active :

~~~~
\documentclass{article}
\usepackage[ngerman]{babel}
\begin{document}
"une

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

\myverb{"a}|"a|
\fin{document}
~~~~

donne

~~~~
La liste des jetons contient les jetons :

" (caractère actif=macro:->active @prefix "active@char" )
a (la lettre a).
}

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

?
La liste des jetons contient les jetons :

" (le personnage ")
a (le caractère a).
}
~~~~

@u-fischer mais laquelle de ces deux sorties veut-on dans le "texte textuel" ?

Le cas "non-actif" me ressemble à ce que LaTeX entendait par " verbatim ".

Mais peut-être que certaines personnes s'attendent à ce que la sortie soit, par exemple, ä qui ne ressemble pas vraiment à « verbatim » pour d'autres personnes.

Comme je l'ai écrit tant de fois : que signifie « verbatim » en dehors de l'ASCII 7 bits imprimable ?

@ car222222 mon exemple concerne l'entrée et non la sortie. Je ne sors rien, j'analyse seulement à quoi ressemble l'argument saisi par xparse. D'après la documentation, je m'attendais à ce que l'argument laisse les caractères actifs tels quels et convertisse tous les autres jetons en catcode 12 et les espaces en catcode 10. Mais comme certains tests montrent que mes attentes étaient fausses : la configuration des caractères actifs avec babel est également convertie en catcode 12 car l'analyseur d'argument contient un \dospecial.

Une autre question : cet argument de type v devrait-il réduire les espaces consécutifs en un seul jeton (avec catcode 10) ou conserver le nombre d'espaces « verbatim » ? Comment cela devrait-il être exactement (je ne pense pas que ce soit bien défini pour le moment dans le manuel) ?

@u-fischer Entrée/sortie ?? Mais vous avez répondu à ma question implicite.

Vous voulez garder l'actif " mais je pense que verbatim devrait produire le non actif " afin qu'aucun glyphe ä ne puisse être affiché.

Quand je dis « je pense », je veux dire que c'est ce que je m'attendrais à suivre du concept original (il y a 40 ans) de « verbatim » dans TeX/LaTeX.

Peut-être que ce concept + définitions doit être changé, mais en quoi exactement ?

Ou, comme le dit @RuixiZhang42 : comment verbatim est verbatim au 21e siècle ?

Verbe intéressant*|YZ| (avec deux onglets consécutifs) donne un seul espace
car le verbe change le catcode de l'espace mais pas de la tabulation.

Je suis d'accord que l'argument de type v (et "+v" aussi) n'est pas bien défini pour le moment. Est-ce que le
suivant a du sens, en utilisant une table de catcode?

  • Donnez le catcode 13 (actif) aux espaces et à quelques autres (`\^^M par exemple ?).

  • Donnez le catcode 12 (autre) à tous les autres octets 0-127 (en pdfTeX), 0-255 (en XeTeX,
    upTeX, pTeX) ou 0-1114111 (LuaTeX).

  • Dans pdfTeX, donnez catcode 13 (actif) aux octets 128-255.

Peut-être est-il préférable de garder certaines choses en tant que catcode 11 (lettres) ?

Vous voulez garder le "

Non je n'ai pas dit ça. J'ai seulement écrit que je m'attendais à ce que cela se produise après avoir lu la documentation. Cela implique seulement que la documentation doit être améliorée.

mais je pense que verbatim devrait produire le « non actif » afin qu'aucun glyphe ä ne puisse être affiché.

Vous pouvez également obtenir "a en sortie avec un " actif : il vous suffit de lui donner localement une définition appropriée.

@u-fischer Vous pouvez obtenir "un comme sortie également avec un actif "

Bien sûr, mais je ne sais pas si le « mode verbatim » devrait nécessiter une telle personnalisation ? Peut-être que ça devrait ?

Revenons à la question : que signifie « verbatim », à la fois pour la lecture d'une liste de jetons d'entrée et également pour la sortie (y compris quelle police, avec quelles ligatures, crénage, autres fonctionnalités de police, etc., etc.).

Peut-être quelque chose comme ça (pour la saisie d'ASCII imprimable uniquement) :
aucun caractère n'est supprimé ou le code de caractère est modifié, le catcode de la plupart devient 12, à l'exception des suivants, qui sont modifiés (ou conservés) en 13, . . . .
Plus les ascii non imprimables suivants qui sont également devenus des jetons catcode 13 : . . .

L'environnement doit être personnalisé pour gérer la sortie (représentation textuelle) de tout caractère ACSII 7 bits qui pourrait, par le processus ci-dessus, s'avérer être en interne un jeton catcode 13.

[Assez différent de l'original, mais ne couvrant toujours que l'entrée ASCII, comme l'original.]

@blefloch a écrit : Dans pdfTeX, donnez catcode 13 (actif) aux octets 128-255.

Le feriez-vous même si inputenc n'est pas utilisé ? Quelle définition leur donneriez-vous ?

Je ne sais pas si quelqu'un a beaucoup réfléchi à l'entrée utf-8 inputenc en mode verbatim. Est-ce que cela sera pris en charge, et qu'est-ce que cela signifie?

Je ne sais pas si quelqu'un a beaucoup réfléchi à l'entrée utf-8 inputenc en mode verbatim. Est-ce que cela sera pris en charge, et qu'est-ce que cela signifie?

Il est pris en charge, au moins pour l'encodage T1. Pour le grec ou similaire, vous devrez redéfinir verbatim@font :

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

\makeatletter
\ defverbatim@font {\ttfamily}
fontencoding{LGR}\selectfont
verbe|Γειά σου Κόσμε|
\fin{document}
~~~

image

Suggestions possibles sur ce que l'argument verbatim devrait faire. Je tends vers l'option 1, mais il me manque peut-être certains aspects.

  1. Mettre à jour les catcodes de 0 à 255 (dans n'importe quel moteur), en conservant les catcodes 11, 12, 13 (lettre/autre/actif) inchangés, en changeant le catcode 10 (espace) en catcode 13 (actif) et tous les autres catcodes en 12 (autre) . Ensuite, appliquez les changements de catcode dans \@noligs , à savoir rendre les éléments de \verbatim@nolig@list actifs. Ensuite, saisissez l'argument : cela donne un résultat avec les catcodes 11, 12, 13 uniquement. Il est facile de reconvertir en chaîne pour les utilisateurs qui ne veulent pas de caractères actifs. Pour ceux qui souhaitent une prise en charge de l'inputenc ou de la sténographie babel, tous les caractères actifs ont été conservés. Il prend également en charge la suppression de la ligature.

  2. Utilisez une table de catcode \l_xparse_verbatim_cctab qui peut être modifiée par l'utilisateur. Il est difficile de rester synchronisé avec les raccourcis babel qui peuvent changer au milieu du document. Il est également difficile à manier pour l'auteur du package car il doit disposer d'une fonction wrapper qui modifie \l_xparse_verbatim_cctab avant d'analyser l'argument verbatim.

  3. Variante de 2. où le cctab est donné en argument v (argument optionnel, ou nouvelle lettre). Encore une fois, cela ne peut pas être synchronisé avec les raccourcis de babel et les modifications apportées au \verbatim@nolig@list .

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

EvanAad picture EvanAad  ·  49Commentaires

dbitouze picture dbitouze  ·  8Commentaires

dbitouze picture dbitouze  ·  14Commentaires

bastien-roucaries picture bastien-roucaries  ·  19Commentaires

dbitouze picture dbitouze  ·  3Commentaires