\\
我想截断(剪切/缩短)包含换行符(或)的字符串,\newline
以便只保留第一行。
我的问题是,我使用todonotes
包并将命令包裹在正常的命令中\todo
。这是一个最小的工作示例:(我的实际命令更复杂)
\newcommand{\TODO}[2]{\todo[#1,inline, caption={#2}]{#2}}
问题是,我可能会用包含换行符的内容调用该函数。设置标题时会失败。此外,使用多行标题也不是个好主意。
\TODO{foo \\ bar}
因此,我想先截断字符串。我尝试了该xstring
包,但我找不到任何关于如何对换行符(\\
或\newline
)执行此操作的信息。我可以使用 xstring 在 x 个字符后截断字符串,但我不知道这需要多长时间\\
才能完成。
答案1
假设\TODO
有一个可选参数用于指定可能的其他选项\todo
和一个强制参数,您只想在待办事项列表中截断它,这里有一种方法:
\documentclass{article}
\usepackage{xparse}
\usepackage{todonotes}
\ExplSyntaxOn
\NewDocumentCommand{\TODO}{ O{} m }
{
\seq_set_split:Nnn \l_tmpa_seq { \\ } { #2 }
\masgo_todo:nfn { #1 } { \seq_item:Nn \l_tmpa_seq { 1 } } { #2 }
}
\cs_new_protected:Nn \masgo_todo:nnn
{
\todo[inline, caption={#2}, #1]{#3}
}
\cs_generate_variant:Nn \masgo_todo:nnn { nf }
\ExplSyntaxOff
\begin{document}
\listoftodos
\section{Test}
First\TODO{x}
Second\TODO{x \\ y}
Third\TODO{x \\ y \\ z}
\end{document}
强制参数在处被拆分\\
,然后第一项用于标题,而整个参数用于注释。