У меня есть такие строки, как
2011-10-29--2-03
но я хочу отобразить их как
2011-10-29, p. 2, fig. 3
Я пытался
\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}
а затем пробовали разные методы (от идей доУдалить начальные нули из целого числа) для обработки последних 2 символов, например
\num[minimum-integer-digits=1]{\StrMid{#1}{15}{16}}
из siunitx
, но это не сработало.
Как это может быть сделано?
решение1
решение2
Следующий код похож наДэвида, но это не предполагает, что номера страниц или рисунков состоят только из цифр. Чтобы это работало, нам нужно съесть начальные нули.
\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}
Если расширяемость не имеет значения, вот вариантответ математики
\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}
решение3
Ответ ниже использует \seq_set_split:Nnn
для разделения аргумента \FormatDatePageFig
. Он применяется \int_to_arabic:n
к последнему элементу этой последовательности.
\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}
решение4
Следующее решение использует LuaLaTeX и работает с любой строкой в кодировке utf8, а не только со строками в кодировке ASCII. Оно не предполагает, что номера страниц или рисунков состоят ровно из 1 или 2 цифр соответственно.
\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}