Latex3: Catat kode dokumen untuk tipe argumen "verbatim" xparse, dokumentasikan cara mereproduksi \verb

Dibuat pada 25 Jun 2020  ·  43Komentar  ·  Sumber: latex3/latex3

Ketika fontenc dimuat dengan opsi T1 , \NewDocumentCommand dengan argumen verbatim melahap - jika isinya berisi -- (terlepas dari pembatas yang digunakan):

\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

Komentar yang paling membantu

Terlepas dari hasil diskusi ini, akan berguna untuk mendokumentasikan dalam
xparse.pdf cara mereproduksi perilaku kata kerja menggunakan \NewDocumentCommand.

Semua 43 komentar

Apa yang Anda lihat adalah ikatan -- pada font mesin tik. Jika Anda menulis \texttt{--} Anda juga akan melihat satu tanda hubung, tetapi jika Anda menyalin dari PDF, Anda akan melihat bahwa itu memang sebuah tanda hubung. Anda dapat memeriksanya dengan memasukkan argumen yang diambil ke \showtokens atau dengan menggunakan \@noligs (LaTeX menggunakannya dalam \verb untuk mencetak -- -- -- ):

\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

tapi v di xparse seharusnya verbatim (bukan?) dan di LaTeX itu berarti mesin tik dengan ligatur ditekan jadi v harus melakukan itu juga menurut saya.

Itu hanya mengambil kata demi kata (kata demi kata di sini setara dengan \let\do\<strong i="5">@makeother</strong> \dospecials ). \@noligs dapat ditambahkan dalam pengaturan catcode untuk memindai argumen. Di sisi lain, ini akan memasukkan token aktif di mana (secara teoritis) hanya ada token catcode-lainnya, jadi jika argumen digunakan untuk sesuatu selain pengaturan huruf, itu bisa menjadi masalah.

Mungkin beberapa cara untuk mengizinkan perintah menambahkan pengaturan kode catnya sendiri, seperti:

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

@FrankMittelbach Saya setuju dengan PhelypeOleinik bahwa "kata demi kata" berarti "ambil apa pun yang ditulis pengguna kata demi kata". Pengikat <hyphen hyphen> ke <endash> lebih merupakan "fitur font" daripada "bug yang mengambil argumen". Juga, \ttfamily tidak berarti "font monospace = tidak ada pengikat sama sekali". Beberapa tipografi monospace dapat digunakan sebagai tipe tubuh (bukan hanya kode), jadi pengikat tanda hubung tidak boleh ditekan dalam kasus seperti itu.

Tetapi bukankah \NewDocumentCommand {\myverb} { v } {#1}\myverb{--all} seharusnya berperilaku sebagai \verb|--all| ?

@dbitouze — tidak juga. \verb memiliki dua bagian — pengambilan argumen dan pemformatan. Pengaturan "v" di \NewDocumentCommand hanya melakukan yang pertama.

@Phelype — kecuali saya melewatkan sesuatu, bukankah saran Anda tidak lebih dari ini?:

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

Dalam hal ini saya rasa tidak perlu. Jadi kembali ke @dbitouze , cara mereplikasi \verb adalah seperti:

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

Pada Kam, 25 Jun 2020 pukul 08:22, Denis Bitouzé [email protected]
menulis:

Tapi bukankah \NewDocumentCommand {\myverb} { v } {#1}\myverb{--all} seharusnya
berperilaku sebagai \verb|--all|?

Tidak persis, karena v hanya tentang menguraikan argumen, dan itu dibaca
verbatim, kata kerja juga mengeset konten dalam font monospace non standar
setup yang menekan ligatur.
jadi daripada hanya #1 untuk mengeset argumen dalam font saat ini, Anda harus
perlu dilakukan

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

kecuali bahwa \ @noligs membutuhkan
\ defverbatim@nolig@list {\do`\do\<\do>\do\,\do\'\do-}
menjadi aktif sehingga kami dapat mempertimbangkan untuk membuat v mengaturnya sebagai aktif. atau
menyediakan pembungkus di sekitar scantoken yang mengatur bahwa \ @noligs dapat berfungsi
di sini

Anda menerima ini karena Anda berlangganan utas ini.
Balas email ini secara langsung, lihat di GitHub
https://github.com/latex3/latex3/issues/756#issuecomment-649302149 , atau
berhenti berlangganan
https://github.com/notifications/unsubscribe-auth/AAJVYAVLBB4ABB3DD5TETRDRYL3MPANCNFSM4OHMH74A
.

@dbitouze tidak, kesamaannya hanya dalam cara argumen dapat dibatasi: Anda dapat menggunakan \myverb!abc!. Hasilnya didokumentasikan sebagai

yang akan menghasilkan argumen grab yang terdiri dari token kode kategori 12 ("lainnya") dan 13 ("aktif"), kecuali spasi, yang diberi kode kategori 10 ("spasi").

Pengurai argumen hanya membaca argumen, tidak mengesetnya. Dan tidak masuk akal untuk menambahkan perintah font atau perintah lain ke dalamnya atau bahkan memprosesnya terlebih dahulu untuk menerapkan \@noligs secara default: Ada cara lain untuk menekan ligatur. Dengan luatex seseorang mungkin akan menerapkan Ligatures=Resetall dan dengan pdflatex seseorang dapat menggunakan \pdfnoligatures dengan font yang sedikit berbeda:

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

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

\begin{dokumen}
--semua

kata kerja|--semua|

\kata kerja saya{-semua}

\kata kerja saya{--semua}

\verbaku{---semua}

\ukuran catatan kaki
--semua \verbaku{--semua}

\ttkeluarga
--semua

kata kerja|--semua|

\kata kerja saya{-semua}

\kata kerja saya{--semua}

\verbaku{---semua}

\ukuran catatan kaki
--semua \verbaku{--semua}

\end{dokumen}
~~~~

@phelype — kecuali saya melewatkan sesuatu, bukankah saran Anda tidak lebih dari ini?:
\NewDocumentCommand {\myverb} { v } { {\ @noligs #1} }

@wspr Jenis, tapi tidak: \@noligs mengubah catcode dari - (dan banyak lainnya) menjadi 13, dan kemudian mendefinisikannya sebagai \def-{\leavevmode\kern\z@\char`-} : menjadi perubahan catcode, itu harus dilakukan sebelum argumen diambil (kecuali kami mempertimbangkan \scantokens ), jadi saran saya untuk mengizinkan argumen "catcode setup" ke v (meskipun itu harus opsional: \NewDocumentCommand {\myverb} { v[\@noligs] } {#1} ).

Terima kasih @phelype — sudah lama sejak saya melihat ke dalam makro itu :)
Dalam hal ini saya menyukai ide argumen penyiapan… bahkan jika dalam hal ini pendekatan lain juga dapat berfungsi untuk menonaktifkan pengikat.

Kami tidak memiliki data opsional dalam spesifikasi arg, jadi itu akan membutuhkan huruf baru ( w ?)

Atau perubahan besar ke v -type

Saya lebih suka memilih V (cocok dengan yang kita miliki o dan O dan d dan D) daripada mempertimbangkan perubahan yang melanggar.

Kami tidak memiliki data opsional dalam spesifikasi arg, jadi itu akan membutuhkan huruf baru ( w ?)

Tidak bisakah kita menambahkan satu?

Atau mungkin, karena kita memiliki o dan O{} , tampaknya wajar untuk memiliki v dan V{} . Tentu saja argumen itu akan berarti hal yang berbeda...

Imho jika catcode harus dapat disesuaikan untuk tipe-v, masuk akal untuk menggunakan kode cctab, dan bukan perintah arbitrer seperti \@noligs . Kemudian pembacaan perintah hanya akan mengatur kode cat dan definisi karakter aktif kemudian harus dilakukan di badan makro.

@u-fischer Jadi saya lebih baik mendapatkan PR itu untuk l3cctab di ...

Saat ini, saya tidak tahu bagaimana l3cctab bekerja dan bagaimana itu bisa membantu untuk masalah saat ini, tetapi saya sangat tertarik :)

Maksud saya adalah bahwa secara semantik v adalah 'verbatim' sedangkan yang dibutuhkan di sini tidak. Yang penting, Anda harus khawatir jika karakter pembatas diubah oleh tabel catcode atau apa pun. Juga, kami telah konsisten bahwa huruf besar -> beberapa varian opsional-arg dari huruf kecil. Jadi saya akan mengatakan sesuatu seperti c{<table>} (= 'catcode') akan benar.

Saya akan menyortir barang cctab hari ini atau besok jika saya bisa, jadi kita bisa berdiskusi.

@dbitouze Tabel catcode adalah cara untuk memiliki set catcode 'tetap' untuk semua karakter (*). Ini berarti Anda mendapatkan antarmuka satu token untuk perubahan, jadi ' \c_document_cctab untuk catcode normal, \c_initex_cctab untuk IniTeX, dll. Idenya adalah ini jauh lebih jelas dan lebih dapat diandalkan daripada satu- pengaturan satu per satu.

  • Di XeTeX, kami tidak memiliki primitif yang diperlukan, jadi saya hanya dapat menutupi karakter 0 hingga 255 dengan kinerja yang wajar.

@josephwright (di luar topik) Sepertinya saya ingin menambahkan catatan kaki tetapi penurunan harga tidak tahu itu.

Menekan kumpulan pengikat yang diketahui selama keluaran juga dapat dilakukan dengan menggunakan \tl_replace_all:Nnn dan mengganti karakter bermasalah dengan sesuatu yang tidak akan membentuk pengikat.

@Skillmon Poin bagus: orang bisa mengambil materi kata demi kata dan mengganti token. Karena semuanya benar-benar kata demi kata, itu mungkin pendekatan yang lebih mudah daripada mengkhawatirkan pengaturan kode cat.

Terlepas dari hasil diskusi ini, akan berguna untuk mendokumentasikan dalam
xparse.pdf cara mereproduksi perilaku kata kerja menggunakan \NewDocumentCommand.

@josephwright tergantung pada jumlah token yang akan diganti, kinerjanya akan jauh lebih buruk dengan pendekatan \tl_replace_all:Nnn .

Juga, bagaimana Anda tahu karakter mana (dalam font yang sangat besar) yang perlu diganti?

Lebih lanjut: apa arti pengaturan huruf 'verbatim dengan font monospace' untuk banyak skrip (non-Eropa)?

@ car222222 dalam font yang sangat besar Anda mendapatkan fitur font sebagai satu-satunya cara yang masuk akal untuk menekan semuanya, LaTeX tidak dapat mengetahui tentang semua kemungkinan ligatur dalam font. Tapi setidaknya karakter yang didukung LaTeX2e bisa ditutupi dengan mudah (hanya \tl_map_function:NN dan \tl_replace_all:Nnn ).

Lebih lanjut: AFAIK ada simbol spasi ganda di beberapa font monospace untuk beberapa skrip non-Eropa.

Saya sarankan hanya membungkus setiap karakter dalam hbox. Sepertinya berhasil
cukup baik, tetapi saya tidak menguji secara ekstensif.

\MemerlukanPaket{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\myverb}{v}{\texttt{\str_map_ function:nN {#1}\ hbox:n }}
\ExplSyntaxOff
\documentclass{artikel}
\usepackage[T1]{fontenc}
\begin{dokumen}
kata kerja|a--b ---c ``<''|

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

Saya sarankan hanya membungkus setiap karakter dalam hbox. Tampaknya bekerja dengan cukup baik, tetapi saya tidak menguji secara ekstensif.

Coba dengan |a--bgrüße ---c ``<''|

Oke, upaya kedua (arg v mempertahankan karakter aktif apa adanya): masukkan \kern 0pt\relax sebelum semua karakter non-aktif.

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

Oke, upaya kedua (arg v mempertahankan karakter aktif apa adanya):

Tapi tidak semua orang. Misalnya kutipan di sini tidak aktif:

~~~~
\documentclass{artikel}
\usepackage[orang Jerman]{babel}
\begin{dokumen}
"sebuah

\ExplSyntaxOn
\NewDocumentCommand { \verba saya } { mv }
{
\tl_analysis_ tampilkan:n {#1}
\tl_analysis_ tampilkan:n {#2}
}
\ExplSyntaxOff

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

memberi

~~~~
Daftar token berisi token:

" (active character=macro:->active @prefix "active@char" )
a (huruf a).
}

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

?
Daftar token berisi token:

"(karakter")
a (karakter a).
}
~~~~

@u-fischer tetapi yang mana dari dua keluaran ini yang diinginkan seseorang dalam 'teks kata demi kata'?

Kasus " Non-aktif menurut saya seperti apa yang LaTeX dulu maksudkan dengan 'verbatim'.

Tapi mungkin beberapa orang mengharapkan hasilnya, misalnya, yang tidak terlihat seperti 'kata demi kata' bagi orang lain.

Seperti yang telah saya tulis berkali-kali: apa artinya 'verbatim' di luar ASCII 7-bit yang dapat dicetak?

@car222222 contoh saya adalah tentang input bukan output. Saya tidak mengeluarkan apa pun, hanya menganalisis seperti apa argumen yang diambil oleh xparse. Dari dokumentasi saya mengharapkan argumen untuk membiarkan karakter aktif apa adanya dan mengonversi semua token lain ke catcode 12, dan spasi ke catcode 10. Tetapi karena beberapa tes menunjukkan harapan saya salah: pengaturan karakter aktif dengan babel juga dikonversi ke catcode 12 karena parser argumen berisi \dospecial.

Satu pertanyaan lain: Haruskah argumen v -type ini menciutkan spasi berturut-turut menjadi satu token (dengan catcode 10), atau mempertahankan jumlah spasi "verbatim"? Persisnya bagaimana "verbatim" seharusnya (saya tidak berpikir itu didefinisikan dengan baik sekarang di manual)?

@u-fischer Masukan/keluaran ?? Tapi Anda menjawab pertanyaan tersirat saya.

Anda ingin tetap aktif " tetapi saya pikir kata demi kata harus menghasilkan non-aktif " sehingga tidak ada glyph yang dapat dihasilkan.

Ketika saya mengatakan "Saya pikir" yang saya maksud adalah bahwa inilah yang saya harapkan untuk diikuti dari konsep 'verbatim' yang asli (40 tahun yang lalu) di TeX/LaTeX.

Mungkin konsep+definisi itu perlu diubah, tapi untuk apa sebenarnya?

Atau seperti yang @RuixiZhang42 katakan: seberapa verbatim abad ke-21 verbatim ?

Menariknya kata kerja*|YZ| (dengan dua tab berturut-turut) memberikan satu spasi
karena kata kerja mengubah kode cat ruang tetapi bukan tab.

Saya setuju argumen tipe-v (dan "+v") tidak terdefinisi dengan baik saat ini. Apakah
berikut masuk akal, menggunakan tabel catcode?

  • Berikan catcode 13 (aktif) ke spasi dan beberapa lainnya (`\^^M misalnya?).

  • Berikan catcode 12 (lainnya) ke semua byte lain 0-127 (dalam pdfTeX), 0-255 (dalam XeTeX,
    upTeX, pTeX), atau 0-1114111 (LuaTeX).

  • Di pdfTeX, berikan catcode 13 (aktif) ke byte 128-255.

Mungkin lebih baik menyimpan beberapa barang sebagai catcode 11 (huruf)?

Anda ingin tetap aktif “

Tidak, saya tidak mengatakan itu. Saya hanya menulis bahwa saya mengharapkan ini terjadi setelah membaca dokumentasi. Ini hanya menyiratkan bahwa dokumentasi perlu ditingkatkan.

tapi saya pikir verbatim harus menghasilkan non-aktif “ sehingga tidak ada glyph yang bisa dihasilkan.

Anda bisa mendapatkan "a sebagai output juga dengan " aktif : Anda hanya perlu memberikan definisi yang sesuai secara lokal.

@u-fischer Anda bisa mendapatkan "a sebagai output juga dengan aktif "

Tentu, tapi saya tidak tahu apakah 'mode kata demi kata' harus memerlukan penyesuaian seperti itu? Mungkin harus?

Kembali ke pertanyaan: apa yang dimaksud dengan 'verbatim', baik untuk membaca daftar token input maupun untuk output (termasuk font apa, dengan ligatur apa, kerning, fitur font lain, dll, dll).

Mungkin seperti ini (hanya untuk input ASCII yang dapat dicetak):
tidak ada karakter yang dihilangkan atau kode karakter yang diubah, catcode sebagian besar menjadi 12, kecuali berikut ini, yang diubah menjadi (atau disimpan pada) 13, . . . .
Ditambah ascii yang tidak dapat dicetak berikut yang juga menjadi token catcode 13: . . .

Lingkungan harus disesuaikan untuk menangani output (representasi teks) dari setiap karakter ACSII 7-bit yang mungkin oleh proses di atas berubah menjadi token catcode 13 secara internal.

[Cukup sedikit berbeda dari aslinya, tetapi hanya mencakup input ASCII, seperti aslinya.]

@blefloch menulis: Di pdfTeX, berikan catcode 13 (aktif) ke byte 128-255.

Apakah Anda akan melakukan ini bahkan jika inputenc tidak digunakan? Definisi apa yang akan Anda berikan kepada mereka?

Saya tidak yakin apakah ada yang berpikir banyak tentang input utf-8 inputenc ke mode verbatim. Apakah ini akan didukung, dan apa artinya?

Saya tidak yakin apakah ada yang berpikir banyak tentang input utf-8 inputenc ke mode verbatim. Apakah ini akan didukung, dan apa artinya?

Ini didukung, setidaknya untuk penyandian T1. Untuk bahasa Yunani atau yang serupa, Anda harus mendefinisikan ulang verbatim@font :

~~~
\documentclass{artikel}
\usepackage[LGR,T1]{fontenc}
\begin{dokumen}
kata kerja|grüße € |

\makeatletter
\ defverbatim@font {\ttfamily}
fontencoding{LGR}\selectfont
kata kerja|Γειά |
\end{dokumen}
~~~

image

Kemungkinan saran untuk apa yang harus dilakukan argumen verbatim. Saya cenderung ke opsi 1, tetapi saya mungkin kehilangan beberapa aspek.

  1. Perbarui catcode dari 0 hingga 255 (di mesin apa pun), pertahankan catcode 11, 12, 13 (huruf/lainnya/aktif) tidak berubah, ubah catcode 10 (spasi) menjadi catcode 13 (aktif), dan semua catcode lainnya menjadi 12 (lainnya) . Kemudian terapkan perubahan catcode di \@noligs , yaitu buat item \verbatim@nolig@list aktif. Kemudian ambil argumennya: ini memberikan hasil dengan kode-kode 11, 12, 13 saja. Sangat mudah untuk mengonversi kembali ke string untuk pengguna yang tidak menginginkan karakter aktif. Bagi mereka yang menginginkan dukungan inputenc atau babel-shorthand, semua karakter aktif telah disimpan. Ini juga mendukung penekanan ligatur.

  2. Gunakan tabel catcode \l_xparse_verbatim_cctab yang dapat diubah oleh pengguna. Ini sulit untuk disinkronkan dengan pintasan babel yang dapat mengubah dokumen tengah. Ini juga berat bagi penulis paket karena mereka harus memiliki fungsi pembungkus yang mengubah \l_xparse_verbatim_cctab sebelum menguraikan argumen verbatim.

  3. Varian 2. di mana cctab diberikan sebagai argumen v (argumen opsional, atau huruf baru). Sekali lagi, ini tidak dapat disinkronkan dengan singkatan babel dan perubahan pada \verbatim@nolig@list .

Apakah halaman ini membantu?
0 / 5 - 0 peringkat