tengo cuerdas como
2011-10-29--2-03
pero quiero mostrarlos como
2011-10-29, p. 2, fig. 3
Lo intenté
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xstring}
\begin{document}
\def\ConvertID#1{%
\StrMid{#1}{1}{10},
p.~\StrMid{#1}{13}{13},
fig.~\StrMid{#1}{15}{16}
}
See \ConvertID{2011-10-29--2-03}.
\end{document}
y luego probé varios métodos (a partir de ideas enEliminar ceros a la izquierda de un número entero) para manejar los últimos 2 caracteres, por ejemplo
\num[minimum-integer-digits=1]{\StrMid{#1}{15}{16}}
de siunitx
, pero no funcionó.
¿Cómo se puede hacer esto?
Respuesta1
Respuesta2
El siguiente código es similar aDavid, pero no supone que los números de página o figura solo consten de dígitos. Para que esto funcione necesitamos devorar los ceros iniciales.
\documentclass{article}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\ConvertID}{m}
{
\mflxvii_convert:n { #1 }
}
\cs_new:Nn \mflxvii_convert:n
{
\__mflxvii_convert:w #1 \q_stop
}
\cs_new:Npn \__mflxvii_convert:w #1--#2-#3 \q_stop
{% #1 is a date in ISO format, #2 is a page number, #3 is a figure number
#1,~
p.\ \__mflxvii_convert_eat:N #2 \q_nil ,~
f.\ \__mflxvii_convert_eat:N #3 \q_nil
}
\cs_new:Nn \__mflxvii_convert_eat:N
{
\quark_if_nil:NF #1
{
\str_if_eq:nnTF { #1 } { 0 }
{% a zero, restart
\__mflxvii_convert_eat:N
}
{% not a zero, finish up
#1 \__mflxvii_convert_deliver:w
}
}
}
\cs_new:Npn \__mflxvii_convert_deliver:w #1 \q_nil { #1 }
\ExplSyntaxOff
\begin{document}
\ConvertID{2011-10-29--22-03}
\ConvertID{2011-10-29--022-3}
\ConvertID{2011-10-29--22-a2}
\edef\test{\ConvertID{2011-10-29--22-a2}}
\texttt{\meaning\test}
\end{document}
Si la capacidad de expansión no es una preocupación, aquí hay una variante derespuesta de matexmatics
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\ConvertID}{m}
{
\mflxvii_convert:n { #1 }
}
\seq_new:N \l__mflxvii_convert_seq
\tl_new:N \l__mflxvii_convert_tl
\cs_new_protected:Nn \mflxvii_convert:n
{
\seq_set_split:Nnn \l__mflxvii_convert_seq { - } { #1 }
\seq_item:Nn \l__mflxvii_convert_seq { 1 } -
\seq_item:Nn \l__mflxvii_convert_seq { 2 } -
\seq_item:Nn \l__mflxvii_convert_seq { 3 } ,~
p.\nobreakspace \__mflxvii_convert_eat:e { \seq_item:Nn \l__mflxvii_convert_seq { 5 } },~
f.\nobreakspace \__mflxvii_convert_eat:e { \seq_item:Nn \l__mflxvii_convert_seq { 6 } }
}
\cs_new_protected:Nn \__mflxvii_convert_eat:n
{
\tl_set:Nn \l__mflxvii_convert_tl { #1 }
\regex_replace_once:nnN { \A 0* } { } \l__mflxvii_convert_tl
\tl_use:N \l__mflxvii_convert_tl
}
\cs_generate_variant:Nn \__mflxvii_convert_eat:n { e }
\ExplSyntaxOff
\begin{document}
\ConvertID{2011-10-29--22-03}
\ConvertID{2011-10-29--022-3}
\ConvertID{2011-10-29--22-a2}
\end{document}
Respuesta3
La respuesta a continuación se utiliza \seq_set_split:Nnn
para dividir el argumento de \FormatDatePageFig
. Se aplica \int_to_arabic:n
al último elemento de esta secuencia.
\documentclass[border=6pt]{standalone}
\ExplSyntaxOn
\seq_new:N \l__mf_format_seq
\NewDocumentCommand { \FormatDatePageFig } { m }
{
\seq_set_split:Nnn \l__mf_format_seq { - } {#1}
\seq_item:Nn \l__mf_format_seq { 1 } -
\seq_item:Nn \l__mf_format_seq { 2 } -
\seq_item:Nn \l__mf_format_seq { 3 } , ~ p. ~
\seq_item:Nn \l__mf_format_seq { 5 } , ~ fig. ~
\int_to_arabic:n { \seq_item:Nn \l__mf_format_seq { 6 } }
}
\ExplSyntaxOff
\begin{document}
\FormatDatePageFig{2011-10-29--2-03}
\end{document}
Respuesta4
La siguiente solución emplea LuaLaTeX y funciona con cualquier cadena codificada en utf8, no solo cadenas codificadas en ASCII. No se supone que los números de página o figura consten exactamente de 1 o 2 dígitos, respectivamente.
\documentclass{article}
\usepackage{luacode} % for 'luacode' environment
\begin{luacode}
function Convert ( s )
s1=unicode.utf8.sub( s , 1 , 10 )
s2=unicode.utf8.match ( unicode.utf8.sub(s,13) , "^.-%-" )
s2=tonumber(unicode.utf8.sub(s2,1,-2))
s3=unicode.utf8.match( s , "-%d*$" )
s3=tonumber(unicode.utf8.sub ( s3, 2 ))
return ( s1 .. ", p.\\ " .. s2 .. ", fig.\\ " .. s3)
end
\end{luacode}
\newcommand\Convert[1]{\directlua{tex.sprint(Convert("#1"))}}
\begin{document}
\Convert{2011-10-29--2-03}
\Convert{2023-12-30--0123-01234}
\end{document}