基本上,我想定义一个宏,其参数应被视为“脚本”,这意味着我想以逐字逐句的方式打印它,包括换行符和特殊字符。此外,我想以第二种方式使用此参数,即作为创建二维码的输入(使用包qrcode
)。一个非常简单的例子如下:
\documentclass{article}
\usepackage{qrcode}
\newcommand{\script}[1]{
#1\qrcode{#1}
}
\begin{document}
\script{test}
\end{document}
当我这样做时,参数显然不会被解释为逐字。由于我需要在两个不同的地方使用参数(均以逐字模式解释),因此我也不能使用环境(例如环境listings
),因为正文不能(直接)用作参数。
我玩了一下 environ 包(参见我之前的问题:是否有可能在环境中“扫描”文本?) 来捕获环境的正文,但同样未能成功将其逐字逐句地记录下来。
我也尝试使用\obeylines
和\StrSubstitute
,但很快就变得非常难看,而且实际上效果不佳。
看起来相当简单,但我已经为此挣扎了很长时间。有什么建议吗?
答案1
我不太确定我是否理解了你想要什么。但是,你的 MWE 可以轻松通过xparse
其v
类型参数实现:
\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}