我有諸如
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}