Por que o comando criado com expl3 não funciona com o comando como argumento?
Estou tentando criar meu comando regex, com expl3, que colocará traço atrás de palavras menores que três caracteres. Isso não tem problema e funciona com texto simples, mas quando tento \inputou \includecomo argumento, meu regex não funciona. Depois disso, crio um novo comando com o texto incluído no arquivo, mas isso também não funciona.
Como exemplo, estou escrevendo o código abaixo, é o mesmo que o cerne do meu 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}
E aqui está a pdflatexsaída.
Posso fazer algo? Tentei usar \expandafter, mas não funciona comigo. Devo usar \NewDocumentCommand? Se for verdade, como posso fazer isso, por favor?
Respostas
Parece que você não entendeu como usar a nova convenção de nomenclatura LaTeX3, bem como a separação entre a camada de programação e a camada de documento. Veja como você pode fazer isso:
\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}
Isso é:
- Agrupe todos os nomes que você define em um módulo, chamei
jiriaqui. - Siga a convenção de nomenclatura na camada de programação. Particularmente, qualquer função definida com
\cs_new:Npndeve aderir a esta convenção. Dê uma olhada na documentação do LaTeX3 para detalhes. - Use xparsepara definir funções em nível de documento.
- Para expandir macros antes de aplicar o regex, use os recursos de controle de expansão do LaTeX3. (Usei a
evariante aqui.)
Como um nó lateral, você pode apenas usar a variável scratch \l_tmpa_tlaqui, em vez de definir a sua própria.