문자열 형식을 다시 지정하고 부분 문자열에서 선행 0을 제거합니다.

문자열 형식을 다시 지정하고 부분 문자열에서 선행 0을 제거합니다.

나는 다음과 같은 문자열을 가지고 있습니다.

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}

그런 다음 다양한 방법을 시도했습니다(정수에서 선행 0 제거) 마지막 2자를 처리합니다. 예:

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

에서 실행 siunitx했지만 작동하지 않았습니다.

어떻게 할 수 있습니까?

답변1

여기에 이미지 설명을 입력하세요

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

답변2

다음 코드는 다음과 유사합니다.데이비드의, 그러나 페이지나 그림 번호가 숫자로만 구성되어 있다고 가정하지는 않습니다. 이것이 작동하려면 앞에 오는 0을 먹어야 합니다.

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

관련 정보