使用 \newcommandx 嵌套多个命令时出现问题

使用 \newcommandx 嵌套多个命令时出现问题

这是论坛中的第一个问题,所以请对我宽容一点 :) 我为我的公司制作了一些会议记录文件,我想要一个自定义命令来在文档中添加注释。我希望文本的颜色和文本框宽度是可选的。此外,我希望这是一个我可以调用的包,而不是在每个我想使用它的文档中都放入这个命令代码。下面是我尝试的解决方案。

这是我的 .sty 文件

\ProvidesPackage{pnutscommands}
\usepackage{color}
\usepackage{seqsplit}
\usepackage{xargs}
\usepackage{xstring}

\newcommandx{\colornote}[3][1=red, 2=3in]{%
    \begin{minipage}{#2}
    \textcolor{#1}{\seqsplit{\StrSubstitute{#3}{ }{~}}}
    \end{minipage}
    }

这是我的 .txt

\documentclass{article}
\usepackage{pnutscommands}

\begin{document}

\colornote[blue][5in]
{17823941dsfdsfdsf 23471239047123 9407123408917234890123748912034712985712389012351}

\colornote
{17823941237490812347123904712389 dsdsfdsfdsfdfs 23748912034712985712389012351}

\end{document}

\StrSubstitute{#3}{ }{~}}如果您用替换,此代码将有效#3。问题是\seqsplit删除了字符串中的空格。因此我尝试了 \StrSubstitute,但它返回了一个我不熟悉的错误。

% Console output:
! Use of \@xs@StrSubstitute@@ doesn't match its definition.
\kernel@ifnextchar ...rved@d =#1\def \reserved@a {
                                              #2}\def \reserved@b {#3}\f...
l.7 ...408917234890123748912034712985712389012351}

有人能帮我修复这个错误或者给我一个更好的解决方案吗?

答案1

这个问题与 无关\newcommandx。您必须先进行替换,然后将其应用于\seqsplit获得的字符串。

还有避免xstring过度扩张的复杂情​​况。

\documentclass{article}

\usepackage{color}
\usepackage{seqsplit}
\usepackage{xargs}
\usepackage{xstring}

\newcommandx{\colornote}[3][1=red, 2=3in]{%
  \begin{minipage}{#2}
  \noexpandarg
  \StrSubstitute{#3}{ }{~}[\TEMP]%
  \textcolor{#1}{\expandafter\seqsplit\expandafter{\TEMP}}%
  \end{minipage}
}

\begin{document}

\colornote[blue][5in]
{17823941dsfdsfdsf 23471239047123 9407123408917234890123748912034712985712389012351}

\colornote
{17823941237490812347123904712389 dsdsfdsfdsfdfs 23748912034712985712389012351}

\end{document}

在此处输入图片描述

强制expl3实施:

\documentclass{article}

\usepackage{color}
\usepackage{seqsplit}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\colornote}{O{red}O{3in}m}
 {
  \begin{minipage}{#2}
  \tl_set:Nn \l_tmpa_tl { #3 }
  \tl_replace_all:Nnn \l_tmpa_tl { ~ } { \nobreakspace }
  \breslend_color_seqsplit:Vn \l_tmpa_tl { #1 }
  \end{minipage}
 }

\cs_new_protected:Nn \breslend_color_seqsplit:nn
 {
  \textcolor{#2}{\seqsplit{#1}}
 }
\cs_generate_variant:Nn \breslend_color_seqsplit:nn { V }
\ExplSyntaxOff

\begin{document}

\colornote[blue][5in]
{17823941dsfdsfdsf 23471239047123 9407123408917234890123748912034712985712389012351}

\colornote
{17823941237490812347123904712389 dsdsfdsfdsfdfs 23748912034712985712389012351}

\end{document}

相关内容