已计算结束位置的子字符串

已计算结束位置的子字符串

我有一个字符串,我想只使用字符串的第一部分直到特定位置。所以我使用 strinstrings 的函数编写了 \stringpart 命令。

我想要拆分的搜索词 (--) 的位置毫无问题地找到了。但是当我想在 \substring 命令中使用该位置时,它给出了错误。

我被困住了——有人可以帮忙吗?——非常感谢!

例子:

\documentclass{article}
\usepackage{stringstrings}

\newcommand\stringpart[1]{
        input: #1\\
        string end is at position\ \whereisword{#1}{--}\\% this works
        \substring{#1}{1}{\whereisword[q]{#1}{--}}\\% this gives errors
}

\begin{document}
\stringpart{this -- that}
\end{document}

错误:

! Use of \\isnextbyte doesn't match its definition.
\kernel@ifnextchar ...rved@d =#1\def \reserved@a {
                                                  #2}\def \reserved@b {#3}\f...
l.11 \stringpart{this -- that}
! Use of \\whereisword doesn't match its definition.
\kernel@ifnextchar ...d@d =#1\def \reserved@a {#2}
                                                  \def \reserved@b {#3}\futu...
l.11 \stringpart{this -- that}
! Undefined control sequence.
<argument> \equal 
                  {\@@teststring }{\endofstring }
l.11 \stringpart{this -- that}
! Argument of \@tempc has an extra }.
<inserted text> 
                \par 
l.11 \stringpart{this -- that}
[... and more errors]

答案1

如果不需要进行拆分的位置,则可以使用expl3以下功能:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\stringpart}{O{1}mO{--}}
 {
  \seq_set_split:Nnn \l_mayr_string_seq { #3 } { #2 }
  \seq_item:Nn \l_mayr_string_seq { #1 }
 }
\seq_new:N \l_mayr_string_seq
\ExplSyntaxOff

\begin{document}

X\stringpart{this -- that}X

X\stringpart[2]{this -- that}X

X\stringpart{this;that}[;]X

X\stringpart[2]{this;that}[;]X

\end{document}

在此处输入图片描述

答案2

stringstrings不是最好的包(我可以这么说,因为它是我写的)。但是,在这种情况下,宏\substring希望看到一个实际值,而不是宏作为其结束位置参数。我应该重写那段代码以使其更宽容。与此同时,需要扩展\theresult,其中包含的中间计算\whereisword

\documentclass{article}
\usepackage{stringstrings}

\newcommand\stringpart[1]{
        input: #1\\
        string end is at position\ \whereisword{#1}{--}\\% this works
        \whereisword[q]{#1}{--}% REDUNDANT, UNLESS ABOVE LINE IS REMOVED
        \def\tmp{\substring{#1}{1}}%
        \expandafter\tmp\expandafter{\theresult}\\% this gives errors
}

\begin{document}
\stringpart{this -- that}
\end{document}

在此处输入图片描述

如果想要能够操作 中的插槽#3#4中的可扩展参数\substring,可以使用这个公式化的\Substring宏。但请注意,虽然\theresult扩展为数字,\whereisword但 不是可扩展参数(它仅在 中产生可扩展输出\theresult)。

在下面的 MWE 中,我实际上将其\the\numexpr\theresult-1\relax作为参数传递#4,以\Substring表明它可以处理更复杂的东西,只要它是可扩展的。

\documentclass{article}
\usepackage{stringstrings}
\newcommand\Substring[4][v]{%
  \edef\tmpA{#3}%
  \edef\tmpB{#4}%
  \def\tmpC{\substring[#1]{#2}}
  \def\tmpD{\expandafter\tmpC\expandafter{\tmpA}}%
  \expandafter\tmpD\expandafter{\tmpB}%
}

\newcommand\stringpart[1]{
        input: #1\\
        string end is at position\ \whereisword{#1}{--}\\% this works
        \whereisword[q]{#1}{--}% Stores answer in \result
        \Substring{#1}{1}{\the\numexpr\theresult-1\relax}\\% works since expanded \result gives number
}

\begin{document}
\stringpart{this -- that}
\end{document}

相关内容