您能逐字解释宏参数吗?

您能逐字解释宏参数吗?

基本上,我想定义一个宏,其参数应被视为“脚本”,这意味着我想以逐字逐句的方式打印它,包括换行符和特殊字符。此外,我想以第二种方式使用此参数,即作为创建二维码的输入(使用包qrcode)。一个非常简单的例子如下:

\documentclass{article}
\usepackage{qrcode}

\newcommand{\script}[1]{
    #1\qrcode{#1}
}

\begin{document}
    \script{test}
\end{document}

当我这样做时,参数显然不会被解释为逐字。由于我需要在两个不同的地方使用参数(均以逐字模式解释),因此我也不能使用环境(例如环境listings),因为正文不能(直接)用作参数。

我玩了一下 environ 包(参见我之前的问题:是否有可能在环境中“扫描”文本?) 来捕获环境的正文,但同样未能成功将其逐字逐句地记录下来。

我也尝试使用\obeylines\StrSubstitute,但很快就变得非常难看,而且实际上效果不佳。

看起来相当简单,但我已经为此挣扎了很长时间。有什么建议吗?

答案1

我不太确定我是否理解了你想要什么。但是,你的 MWE 可以轻松通过xparsev类型参数实现:

\documentclass{article}
\usepackage{qrcode,xparse}

\NewDocumentCommand{\script}{v}{%
  \texttt{#1} \qrcode{#1}%
}

\begin{document}

\script{test} \script{&$\#$}

\end{document}

不过,请记住,现在由于参数是逐字读取的,因此首先\script{&$\#$}会给出与直接使用不同的二维码\qrcode{&$\#$}。如果这不是你想要的,那么也许

\NewDocumentCommand{\script}{v}{%
  \texttt{#1} \scantokens{\qrcode{#1}\ignorespaces}\relax
}

将是一个解决方案。

第一个版本的输出(逐字输入的二维码):

在此处输入图片描述

第二个版本的输出(直接使用 qrcode 即可\qrcode):

在此处输入图片描述


listings使用(及其writefile方面)做类似事情的环境的想法catchfile- 这个想法是将环境的内容写入外部文件,然后使用它来生成二维码:

\documentclass{article}
\usepackage{qrcode,listings,catchfile}

\makeatletter
\lst@RequireAspects{writefile}
\lstnewenvironment{script}[1][]
  {%
    \lstset{#1}%
    \lst@BeginAlsoWriteFile{\jobname.script}%
  }
  {%
    \lst@EndWriteFile
    \CatchFileDef\script@tmp{\jobname.script}{}%
    \expandafter\qrcode\expandafter{\script@tmp}%
  }
\makeatother

\begin{document}

\begin{script}[basicstyle=\ttfamily,columns=fullflexible,gobble=2]
  foo bar

  baz
\end{script}

\qrcode{foo bar

baz
}

\end{document}

相关内容