![已计算结束位置的子字符串](https://linux22.com/image/359468/%E5%B7%B2%E8%AE%A1%E7%AE%97%E7%BB%93%E6%9D%9F%E4%BD%8D%E7%BD%AE%E7%9A%84%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我有一个字符串,我想只使用字符串的第一部分直到特定位置。所以我使用 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}