Perché il comando creato con Expl3 non funziona con il comando come argomento?

Oct 10 2020

Sto cercando di creare il mio comando regex, con expl3, che sposterà il trattino dietro le parole più corte di tre caratteri. Questo non è un problema e funziona con un testo semplice, ma quando provo \inputo \includecome argomento, la mia regex non funziona. Dopodiché, creo un nuovo comando con il testo incluso nel file, ma anche questo non funziona.

Ad esempio, sto scrivendo il codice di seguito, è lo stesso del nucleo del mio problema.

\documentclass{article}
\usepackage{expl3}

\ExplSyntaxOn
\tl_new:N \l_myCommand_tl
\cs_new:Npn \myCommand #1 {
    \tl_set:Nn \l_myCommand_tl {#1}
    \regex_replace_all:nnN {([\ \t\n\_\/]{1})(.{1,3})([\ \t\n]{1})} {\1\2\-} \l_myCommand_tl
    \tl_use:N \l_myCommand_tl
}
\ExplSyntaxOff

\newcommand{\SomeText}{Just put dast behind words with three or less length.}

\begin{document}

\myCommand{Just put dast behind words with three or less length.}

\myCommand{\SomeText}

\end{document}

Ed ecco l' pdflatexoutput.

C'è qualcosa che posso fare? Ho provato a usare \expandafter, ma questo non funziona per me. Devo usare \NewDocumentCommand? Se è vero, come posso farlo, per favore?

Risposte

schtandard Oct 10 2020 at 13:16

Sembra che tu abbia frainteso come usare la nuova convenzione di denominazione LaTeX3, così come la separazione tra il livello di programmazione e il livello del documento. Ecco come potresti farlo:

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
  \tl_new:N \l_jiri_tmpa_tl
  \cs_new:Npn \jiri_dash_putter:n #1 {
      \tl_set:Nn \l_jiri_tmpa_tl { #1 }
      \regex_replace_all:nnN { \b(\w{1,3})\b } { \1\2- } \l_jiri_tmpa_tl
      \tl_use:N \l_jiri_tmpa_tl
  }
  \cs_generate_variant:Nn \jiri_dash_putter:n { e }
  \NewDocumentCommand \myCommand { m }
    { \jiri_dash_putter:e { #1 } }
\ExplSyntaxOff

\newcommand{\SomeText}{Just put dash behind words with three or less length.}

\begin{document}

\myCommand{Just put dash behind words with three or less length.}

\myCommand{\SomeText}

\end{document}

Questo è:

  • Raggruppa tutti i nomi che definisci in un modulo, l'ho chiamato jiriqui.
  • Attenersi alla convenzione di denominazione nel livello di programmazione. In particolare, qualsiasi funzione definita con \cs_new:Npndeve aderire a questa convenzione. Dai un'occhiata alla documentazione LaTeX3 per i dettagli.
  • Utilizzare xparseper definire le funzioni a livello di documento.
  • Per espandere le macro prima di applicare la regex, utilizzare le capacità di controllo dell'espansione LaTeX3. (Ho usato la evariante qui.)

Come nodo laterale, potresti semplicemente usare la variabile zero \l_tmpa_tlqui, invece di definire la tua.