Einen String neu formatieren und führende Nullen aus Teilstrings entfernen

Einen String neu formatieren und führende Nullen aus Teilstrings entfernen

Ich habe Zeichenfolgen wie

2011-10-29--2-03

aber ich möchte sie anzeigen als

2011-10-29, p. 2, fig. 3

Ich habe es versucht

\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}

und probierte dann verschiedene Methoden aus (von Ideen beiEntfernen Sie führende Nullen aus einer Ganzzahl), um die letzten beiden Zeichen zu verarbeiten, z. B.

\num[minimum-integer-digits=1]{\StrMid{#1}{15}{16}}

von siunitx, aber es hat nicht funktioniert.

Wie kann das erreicht werden?

Antwort1

Bildbeschreibung hier eingeben

\documentclass{article}

\def\foo#1{\xfoo#1\relax}
\def\xfoo#1--#2-#3\relax{#1, p.\ \number#2, fig.\ \number#3\relax}
\begin{document}

\foo{2011-10-29--2-03}

\end{document}

Antwort2

Der folgende Code ähneltDavids, aber es wird nicht davon ausgegangen, dass Seiten- oder Abbildungsnummern nur aus Ziffern bestehen. Damit dies funktioniert, müssen wir führende Nullen entfernen.

\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}

Bildbeschreibung hier eingeben

Wenn die Erweiterbarkeit kein Problem darstellt, finden Sie hier eine Variante vonAntwort von 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}

Bildbeschreibung hier eingeben

Antwort3

Die folgende Antwort verwendet \seq_set_split:Nnndas Argument von \FormatDatePageFig. Sie gilt \int_to_arabic:nfür das letzte Element dieser Sequenz.

Bildbeschreibung hier eingeben

\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}

Antwort4

Die folgende Lösung verwendet LuaLaTeX und funktioniert mit allen UTF-8-codierten Zeichenfolgen, nicht nur mit ASCII-codierten Zeichenfolgen. Sie geht nicht davon aus, dass die Seiten- oder Abbildungsnummern jeweils aus genau 1 oder 2 Ziffern bestehen.

Bildbeschreibung hier eingeben

\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}

verwandte Informationen