Latex3: أكواد المستند لنوع الوسيطة "الحرفية" الخاصة بـ xparse ، قم بتوثيق كيفية إعادة إنتاج \ فعل

تم إنشاؤها على ٢٥ يونيو ٢٠٢٠  ·  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 يعني ذلك الآلة الكاتبة ذات الأحرف المزدوجة المكبوتة لذا يجب أن تفعل ذلك أيضًا في رأيي.

إنها تلتقط حرفيا (حرفيا هنا ما يعادل \let\do\<strong i="5">@makeother</strong> \dospecials ). \@noligs في إعداد رمز القطيفة لمسح الوسيطة. من ناحية أخرى ، سيؤدي هذا إلى إدراج الرموز المميزة النشطة حيث (نظريًا) لا يوجد سوى رموز أخرى من رمز القط ، لذلك في حالة استخدام الوسيطة لشيء آخر غير التنضيد ، فقد يكون ذلك مشكلة.

ربما توجد طريقة ما للسماح للأمر بإضافة إعدادات رمز القطيفة الخاص به ، مثل:

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

FrankMittelbach أتفق مع PhelypeOleinik على أن "حرفيا" تعني "انتزاع أي مستخدم كتب حرفيا". إن <hyphen hyphen> to <endash> هو "ميزة خط" أكثر من كونه "خطأ شائع". أيضًا ، لا يعني \ttfamily "خط أحادي المسافة = لا توجد روابط ربط على الإطلاق". يمكن استخدام بعض الخطوط أحادية المسافة كنوع جسم (وليس مجرد رمز) ، لذلك يجب عدم منع ربط الواصلة في مثل هذه الحالات.

ولكن أليس من المفترض أن يتصرف \NewDocumentCommand {\myverb} { v } {#1}\myverb{--all} مثل \verb|--all| ؟

dbitouze - ليس في الحقيقة. \ الفعل له جزأين - الاستيلاء على الحجة والتنسيق. الإعداد "v" في \ NewDocumentCommand يقوم فقط بالأول.

@ Phelype - ما لم

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

في هذه الحالة لا أعتقد أنه ضروري. لذا بالعودة إلى dbitouze ، فإن طريقة تكرار الفعل هي شيء من هذا القبيل:

\ حرف
\ NewDocumentCommand {\ myverb} {v} {{\noligs \ ttfamily # 1}}
\ صنع أخرى

يوم الخميس ، 25 حزيران (يونيو) 2020 الساعة 08:22 ، دينيس بيتوزه [email protected]
كتب:

ولكن ليس من المفترض أن \ NewDocumentCommand {\ myverb} {v} {# 1} \ myverb {- 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-}
لتكون نشيطًا حتى نتمكن من التفكير في جعلها نشطة. أو
توفير غلاف حول scantokens الذي يرتب أن \ noligs يمكن أن يعمل
هنا

أنت تتلقى هذا لأنك مشترك في هذا الموضوع.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على 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}
\ صنف الوثيقة {مقالة}
\ usepackage [T1] {fontenc}
\ usepackage {xfp، xparse}

\ حرف
\ NewDocumentCommand {\ myverb} {v} {{fontize {\ fpeval {\ f@size+0.0001 }} {\ normalbaselineskip} \ selectfont \ pdfnoligatures \ font # 1}}
\ صنع أخرى

\ ابدأ {مستند}
--الكل

فعل | - الكل |

\ myverb {-all}

\ myverb {- all}

\ myverb {--- الكل}

\ حاشية سفلية
- all \ myverb {- all}

\ t العائلة
--الكل

فعل | - الكل |

\ myverb {-all}

\ myverb {- all}

\ myverb {--- الكل}

\ حاشية سفلية
- all \ myverb {- all}

\ نهاية {المستند}
~~~~

phelype - ما لم
\ NewDocumentCommand {\ myverb} {v} {{\ noligs # 1}}

wspr Kind of ، لكن لا: \@noligs يغير رمز catcode الخاص بـ - (ومجموعة أخرى) إلى 13 ، ثم حدده كـ \def-{\leavevmode\kern\z@\char`-} : كونه تغييرًا في رمز catcode ، يجب أن يتم ذلك قبل الحصول على الوسيطة (ما لم نفكر في \scantokens ) ، وبالتالي فإن اقتراحي للسماح باستخدام وسيطة "catcode setup" بـ v (على الرغم من أنها يجب أن تكون اختيارية: \NewDocumentCommand {\myverb} { v[\@noligs] } {#1} ).

شكرًا phelype - لقد
في هذه الحالة ، تعجبني فكرة وسيطة الإعداد ... حتى إذا كان في هذه الحالة يمكن أن تعمل الطرق الأخرى أيضًا على تعطيل الأحرف المزدوجة.

ليس لدينا بيانات اختيارية في مواصفات الوسيطة ، لذلك ستحتاج إلى حرف جديد ( w ؟)

أو تغيير فاصل إلى النوع v

أفضل التصويت لـ V (تطابق أن لدينا o و O و d و D) ثم للنظر في تغيير مفاجئ.

ليس لدينا بيانات اختيارية في مواصفات الوسيطة ، لذلك ستحتاج إلى حرف جديد ( w ؟)

لا يمكننا إضافة واحد؟

أو ربما ، نظرًا لأن لدينا o و O{} ، يبدو من الطبيعي أن يكون لدينا v و V{} . بالطبع ستعني الحجة أشياء مختلفة ...

Imho إذا كان يجب أن تكون رموز catcodes قابلة للتخصيص للنوع v ، فمن المنطقي استخدام كود cctab ، وليس بعض الأوامر التعسفية مثل \@noligs . عندئذٍ ، ستعمل قراءة الأمر على تعيين رموز cat فقط ، ويجب بعد ذلك إجراء تعريفات الأحرف النشطة في نص الماكرو.

@ u-fischer لذا من الأفضل أن أحصل على العلاقات العامة مقابل l3cctab في ...

حاليًا ، ليس لدي أي فكرة عن كيفية عمل l3cctab وكيف يمكن أن يكون مفيدًا للمشكلة الحالية ولكني مهتم حقًا :)

كانت وجهة نظري أن v تعني حرفياً "حرفياً" بينما ما هو مطلوب هنا ليس كذلك. الأهم من ذلك ، يجب أن تقلق إذا تم تغيير أحرف التحديد بواسطة جدول رمز القط أو أي شيء آخر. أيضًا ، لقد كنا متسقين مع هذه الأحرف الكبيرة -> بعض متغيرات الوسيطة الاختيارية لحرف صغير. لذلك أقول إن شيئًا مثل c{<table>} (= 'catcode') سيكون صحيحًا.

سأحصل على العناصر cctab مرتبة اليوم أو غدًا إذا استطعت ، حتى نتمكن من المناقشة.

dbitouze جدول الكود القطني هو طريقة للحصول على مجموعة "ثابتة" من رمز cat لجميع الأحرف (*). هذا يعني أنك تحصل على واجهة ذات رمز واحد للتغييرات ، لذا " \c_document_cctab لأكواد الكود العادي ، \c_initex_cctab لـ IniTeX ، إلخ. الفكرة هي أن هذا أوضح بكثير وأكثر موثوقية من واحد- إعداد واحد.

  • في XeTeX ، ليس لدينا الأساسيات الضرورية ، لذلك يمكنني فقط تغطية الأحرف من 0 إلى 255 بأداء معقول.

josephwright (خارج الموضوع) يبدو لي أنك أردت إضافة حاشية سفلية لكن Markdown لم يكن يعرف ذلك.

يمكن أيضًا منع مجموعة معروفة من الأحرف المركبة أثناء الإخراج باستخدام \tl_replace_all:Nnn واستبدال الحرف المشكل بشيء لا يشكل الرابط.

Skillmon نقطة جيدة: يمكن للمرء أن يأخذ المواد الحرفية ويستبدل الرموز. نظرًا لأن كل شيء حرفي تمامًا ، فمن المحتمل أن يكون هذا نهجًا أسهل من القلق بشأن إعداد رمز القط.

بغض النظر عن نتيجة هذه المناقشة ، سيكون من المفيد التوثيق بتنسيق
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
\ صنف الوثيقة {مقالة}
\ usepackage [T1] {fontenc}
\ ابدأ {مستند}
فعل | أ - ب --- ج "<'' |

\ myverb | أ - ب --- ج `` <'' |
\ نهاية {المستند}

أود أن أقترح فقط لف كل شخصية في 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 بالأحرف النشطة كما هي):

لكن ليس الجميع. على سبيل المثال ، الاقتباس هنا غير نشط:

~~~~
\ صنف الوثيقة {مقالة}
\ usepackage [ngerman] {babel}
\ ابدأ {مستند}

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

\ myverb {"a} |" أ |
\ نهاية {المستند}
~~~~

يعطي

~~~~
تحتوي قائمة الرموز المميزة على الرموز المميزة:

"(الحرف النشط = الماكرو: -> activeprefix " active @ char ")
أ (الحرف أ).
}

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

؟
تحتوي قائمة الرموز المميزة على الرموز المميزة:

" (الشخصية ")
أ (الحرف أ).
}
~~~~

@ u-fischer ولكن أي من هذين المخرجين يريده المرء في "النص الحرفي"؟

تبدو حالة غير نشطة بالنسبة لي مثل ما كان LaTeX يعنيه بكلمة "حرفيًا".

لكن ربما يتوقع بعض الناس أن تكون المخرجات ، على سبيل المثال ، ä والتي لا تشبه إلى حد كبير "حرفيًا" للآخرين.

كما كتبت مرات عديدة: ماذا تعني كلمة "حرفيًا" خارج ASCII 7 بت القابل للطباعة؟

@ car222222 المثال الخاص بي يتعلق بالإدخال وليس الإخراج. أنا لا أخرج أي شيء ، فقط أقوم بتحليل كيف تبدو الحجة التي تم الحصول عليها بواسطة xparse. من التوثيق ، توقعت أن تسمح الحجة بترك الرموز النشطة كما هي وتحويل جميع الرموز المميزة الأخرى إلى رمز catcode 12 ، والمسافات إلى رمز catcode 10. ولكن كما أظهرت بعض الاختبارات ، فإن توقعاتي كانت خاطئة: يتم تحويل إعداد الأحرف النشطة مع babel إلى رمز catcode 12 أيضًا لأن المحلل اللغوي يحتوي على \ dospecial.

سؤال واحد آخر: هل يجب على هذه الوسيطة v -type طي المسافات المتتالية في رمز مميز واحد (مع رمز cat 10) ، أم الاحتفاظ بعدد المسافات "حرفياً"؟ كيف يجب أن تكون "الحرف اليدوية" بالضبط (لا أعتقد أنها محددة جيدًا الآن في الدليل)؟

@ u-fischer الإدخال / الإخراج ؟؟ لكنك أجبت على سؤالي الضمني.

تريد الاحتفاظ بـ "ولكني أعتقد أن الحرف الحرفي يجب أن ينتج غير نشط" بحيث لا يمكن إخراج أي حرف رسومي.

عندما أقول "أعتقد" أعني أن هذا ما أتوقع أن أتبعه من المفهوم الأصلي (منذ 40 عامًا) لـ "حرفيا" في TeX / LaTeX.

ربما يحتاج هذا المفهوم + التعريفات إلى التغيير ، ولكن إلى ماذا بالضبط؟

أو كما قال @ RuixiZhang42 : ما مدى حرفية القرن الحادي والعشرين؟

من المثير للاهتمام فعل * | YZ | (مع علامتي تبويب متتاليتين) يعطي مسافة واحدة
لأن الفعل يغير رمز القطيفة للمساحة ولكن ليس من علامة التبويب.

أوافق على حجة نوع v (و "+ v" أيضًا) ليست محددة جيدًا في الوقت الحالي. من شأنه
ما يلي منطقي ، باستخدام جدول رمز القط؟

  • أعط رمز catcode 13 (نشط) للمسافات وعدد قليل من الآخرين (`^ ^ M على سبيل المثال؟).

  • أعط رمز catcode 12 (غير ذلك) لجميع البايتات الأخرى 0-127 (في pdfTeX) ، 0-255 (في XeTeX ،
    upTeX أو pTeX) أو 0-1114111 (LuaTeX).

  • في pdfTeX ، أعط الرمز القطعي 13 (نشط) للبايت 128-255.

ربما يكون من الأفضل الاحتفاظ ببعض الأشياء مثل رمز القطيفة 11 (الحروف)؟

تريد أن تظل نشطًا "

لا لم أقل ذلك. كتبت فقط أنني توقعت أن يحدث هذا بعد قراءة الوثائق. هذا يعني فقط أن الوثائق بحاجة إلى تحسين.

لكني أعتقد أن الحرف الحرفي يجب أن ينتج غير النشط "بحيث لا يمكن إخراج أي حرف رسومي.

يمكنك الحصول على "a كمخرج أيضًا مع " نشط: ما عليك سوى إعطائه محليًا تعريفًا مناسبًا.

@ u-fischer يمكنك الحصول على "a كمخرج أيضًا مع نشط"

بالتأكيد ، لكني لا أعرف ما إذا كان "الوضع الحرفي" بحاجة إلى مثل هذا التخصيص؟ ربما ينبغي؟

العودة إلى السؤال: ماذا تعني كلمة "حرفيًا" ، سواء لقراءة قائمة رموز الإدخال وأيضًا للإخراج (بما في ذلك الخط ، مع ما هي الأحرف المزدوجة ، وتقنين الأحرف ، وميزات الخط الأخرى ، وما إلى ذلك).

ربما شيء من هذا القبيل (لإدخال ASCII القابل للطباعة فقط):
لم تتم إزالة أي حرف أو تغيير رمز الحرف ، يصبح رمز cat لمعظم الرموز 12 ، باستثناء ما يلي ، والذي تم تغييره إلى (أو الاحتفاظ به في) 13 ،. . . .
بالإضافة إلى رموز ASCII التالية غير القابلة للطباعة والتي أصبحت أيضًا رمز catcode 13:. . .

يجب تخصيص البيئة للتعامل مع الإخراج (تمثيل نصي) لأي حرف ACSII 7 بت والذي قد يتضح من خلال العملية المذكورة أعلاه أن يكون داخليًا رمز catcode 13.

[مختلفة قليلاً عن الأصل ، لكنها لا تزال تغطي مدخلات ASCII فقط ، مثل الأصل.]

كتب blefloch : في pdfTeX ، أعط الرمز القطعي 13 (نشط) إلى 128-255 بايت.

هل ستفعل هذا حتى لو لم يتم استخدام المدخلات؟ ما هو التعريف الذي ستقدمه لهم؟

لست متأكدًا مما إذا كان أي شخص قد فكر كثيرًا في إدخال UTF-8 في الوضع الحرفي. وهل سيؤيد هذا وماذا يعني؟

لست متأكدًا مما إذا كان أي شخص قد فكر كثيرًا في إدخال UTF-8 في الوضع الحرفي. وهل سيؤيد هذا وماذا يعني؟

إنه مدعوم ، على الأقل لترميز T1. بالنسبة للغة اليونانية أو ما شابهها ، يجب إعادة تعريف الخط الحرفي @ :

~~~
\ صنف الوثيقة {مقالة}
\ usepackage [LGR، T1] {fontenc}
\ ابدأ {مستند}
فعل | grüße € |

\ حرف
\ defverbatim @ font {\ ttfamily}
ترميز الخطوط {LGR} \ selectfont
فعل | Γειά σου Κόσμε |
\ نهاية {المستند}
~~~

image

اقتراحات محتملة لما يجب أن تفعله الحجة الحرفية. أميل إلى الخيار 1 ، لكن قد أفتقد بعض الجوانب.

  1. قم بتحديث رموز catcodes من 0 إلى 255 (في أي محرك) ، والحفاظ على رموز catcodes 11 ، و 12 ، و 13 (حرف / آخر / نشط) دون تغيير ، وتغيير رمز catcode 10 (مسافة) إلى رمز catcode 13 (نشط) ، وجميع رموز catcodes الأخرى إلى 12 (أخرى) . ثم قم بتطبيق التغييرات في رمز catcode في \@noligs ، أي جعل العناصر النشطة \verbatim@nolig@list . ثم اختر الحجة: هذا يعطي نتيجة مع رموز catcodes 11 ، 12 ، 13 فقط. من السهل التحويل مرة أخرى إلى سلسلة للمستخدمين الذين لا يريدون أحرفًا نشطة. بالنسبة لأولئك الذين يريدون دعم الإدخال أو الاختزال بابل ، تم الاحتفاظ بجميع الشخصيات النشطة. كما أنه يدعم قمع الأربطة.

  2. استخدم جدول رمز القط \l_xparse_verbatim_cctab الذي يمكن للمستخدم تغييره. من الصعب أن تظل متزامنًا مع اختصارات بابل التي قد تغير منتصف المستند. كما أنه غير عملي بالنسبة لكاتب الحزمة نظرًا لأنه يحتاج إلى وظيفة غلاف تتغير \l_xparse_verbatim_cctab قبل تحليل الوسيطة الحرفية.

  3. متغير 2. حيث يتم إعطاء cctab كوسيطة v (وسيطة اختيارية ، أو حرف جديد). مرة أخرى ، لا يمكن أن يظل هذا متزامنًا مع اختصارات بابل والتغييرات إلى \verbatim@nolig@list .

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات