我有如下字符串
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}
如果不考虑可扩展性,这里有一个变体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}
答案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}