次のような文字列があります
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 を使用し、ASCII でエンコードされた文字列だけでなく、UTF8 でエンコードされた任意の文字列で動作します。ページ番号または図番号がそれぞれ 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}