%20frente%20a%20xparse%20(l3)%20en%20an%C3%A1lisis%20simple.png)
Entiendo que el procesamiento de cadenas se puede realizar LaTeX2e
usando xstring
y expl3
usando xparse
(originalmente basado en elHilo de 2013 "Tokenización y análisis") Ejecutaré una macro de análisis de cadenas relativamente simple cientos de veces en un documento, probablemente en muchas compilaciones y muchos documentos, y me gustaría saber qué método es más eficiente en términos de tiempo y/o computacional, descontando el tiempo fijo para cargar los paquetes. .
Una aproximación basada en un breve vistazo al xstring
código de 's sería muy bienvenida por parte del equipo 3e aquí. No necesito nada parecido a resultados exactos; esto es por mi propia curiosidad y solo para asegurarme de no terminar intentando atravesar una pared de ladrillos en alguna parte.
También me interesaría recibir opiniones sobre si esta aplicación es una comparación útil de los algoritmos 2e y 3e.
Esta es la macro que estoy ejecutando xstring
: es para resaltar muy ligeramente la primera letra (las dos primeras letras para esta demostración) de cada mención de palabras y frases clave, lo que simplemente abarrotaría la página si estuviera completamente resaltada:
\documentclass{article}
\usepackage{xstring}
%%% capitalize first n letters of each word %%%
% apply operator#3 to string#1 with word separators #2
\newcommand{\Splitstrop}[3][ ]{%
\providecommand\csA{}%
\providecommand\csB{}%
\StrCut{#3}{#1}\csA\csB%
#2{\csA}%
\ifx\csB\empty\else{#1}\Splitstrop[#1]{#2}{\csB}\fi\relax}
% apply operation#3 on first #2 letters of string #1
\newcommand{\Leftstrop}[3][1]{#2{\StrLeft{#3}{#1}}\StrGobbleLeft{#3}{#1}\relax}
\newcommand{\Kw}[1]{\textsc{#1}} %first mention of keyword/phrase
\newcommand{\Kwd}[1]{\Leftstrop[2]{\Kw}{#1}} %single-word 2nd mention: apply \Kw to first two letters of the word (I plan to sc just the first letter, but this is more illustrative)
\newcommand{\Kwds}[1]{\Splitstrop[ ]{\Kwd}{#1}} % keyphrase 2nd mention: apply Kwd to each word (space is word separator)
\begin{document}
Example: We define the \Kw{embiggen} \Kwd{operator} to raise the size of the \Kwd{argument} by one.
This is a reminder not to \Kwds{beg the question} in your definitions (Sec. 2-1): don't say ``We define the \Kwd{embiggen} \Kwd{operator} as the \Kwd{operator} that \Kwd{embiggens}.''
\end{document}
Respuesta1
Probé tu ejemplo con l3benchmark
:
\documentclass{article}
\usepackage{xstring,l3benchmark}
%%% capitalize first n letters of each word %%%
% apply operator#3 to string#1 with word separators #2
\newcommand{\Splitstrop}[3][ ]{%
\StrCut{#3}{#1}\csA\csB
#2{\csA}%
\ifx\csB\empty\else{#1}\Splitstrop[#1]{#2}{\csB}\fi\relax
}
% apply operation#3 on first #2 letters of string #1
\newcommand{\Leftstrop}[3][1]{#2{\StrLeft{#3}{#1}}\StrGobbleLeft{#3}{#1}\relax}
\newcommand{\Kw}[1]{\textsc{#1}} %first mention of keyword/phrase
\newcommand{\Kwd}[1]{\Leftstrop[2]{\Kw}{#1}} %single-word 2nd mention: apply \Kw to first two letters of the word (I plan to sc just the first letter, but this is more illustrative)
\newcommand{\Kwds}[1]{\Splitstrop[ ]{\Kwd}{#1}} % keyphrase 2nd mention: apply Kwd to each word (space is word separator)
\ExplSyntaxOn
\cs_set_eq:NN \benchmark \benchmark:n
\ExplSyntaxOff
\begin{document}
\benchmark{
Example: We define the \Kw{embiggen} \Kwd{operator} to raise the size of the
\Kwd{argument} by one.
This is a reminder not to \Kwds{beg the question} in your definitions (Sec. 2-1):
don't say ``We define the \Kwds{embiggen operator} as the \Kwd{operator}
that \Kwd{embiggens}.''
}
\end{document}
y la expl3
versión
\documentclass{article}
\usepackage{xparse,l3benchmark}
\ExplSyntaxOn
\NewDocumentCommand{\Kw}{m}
{
\kompootor_textsc:n { #1 }
}
\NewDocumentCommand{\Kwd}{m}
{
\kompootor_split:Nnn \kompootor_textsc:n { 2 } { #1 }
}
\NewDocumentCommand{\Kwds}{m}
{
\kompootor_splitstrop:nNn { ~ } \kompootor_textsc:n { #1 }
}
\seq_new:N \l__kompootor_splitstrop_in_seq
\seq_new:N \l__kompootor_splitstrop_out_seq
\cs_new_protected:Nn \kompootor_splitstrop:nNn
{
\seq_set_split:Nnn \l__kompootor_splitstrop_in_seq { #1 } { #3 }
\seq_set_map:NNn \l__kompootor_splitstrop_out_seq \l__kompootor_splitstrop_in_seq
{ \kompootor_leftstrop:Nn #2 { ##1 } }
\seq_use:Nn \l__kompootor_splitstrop_out_seq { #1 }
}
\cs_new_protected:Nn \kompootor_leftstrop:Nn
{
\kompootor_split:Nnn #1 { 2 } { #2 }
}
\cs_new:Nn \kompootor_split:Nnn
{
#1 { \tl_range:nnn { #3 } { 1 } { #2 } }
\tl_range:nnn { #3 } { #2+1 } { -1 }
}
\cs_new_protected:Nn \kompootor_textsc:n { \textsc { #1 } }
\NewDocumentCommand{\benchmark}{+m}{\benchmark:n{#1}}
\ExplSyntaxOff
\begin{document}
\benchmark{
Example: We define the \Kw{embiggen} \Kwd{operator} to raise the size of the
\Kwd{argument} by one.
This is a reminder not to \Kwds{beg the question} in your definitions (Sec. 2-1):
don't say ``We define the \Kwds{embiggen operator} as the \Kwd{operator}
that \Kwd{embiggens}.''
}
\end{document}
El resultado es
0.00338 seconds (1.1e4 ops)
para la xstring
implementación y
0.00187 seconds (6.29e3 ops)
para la expl3
implementación.
La salida es idéntica (eliminando \benchmark
):