usebox 宏没有扩展?

usebox 宏没有扩展?

我正在尝试存储 shell 命令的文本输出mktemp,并在稍后在另一个 latex 命令中重复使用它。我尝试使用\savebox和执行此操作\usebox,如下所示。在\usebox命令外部使用时,保存的文本会正确打印。但是,当在其他命令(如\write18和 )内使用时\includegraphics,该\usebox命令似乎无法正确进行宏扩展:

\newcommand{\mktemp}[0]{
  \input{|"mktemp"}
}

\newcommand{\hrefqr}[2]{%
  \tracingall
  \newsavebox{\tmp}
  \savebox{\tmp}{\mktemp}
  %% verify that \tmp is the same file and not repeated mktemp calls
  \usebox{\tmp} \\
  \usebox{\tmp} \\
  \immediate\write18{qrencode #1 -o \usebox{\tmp}}
  \href{#1}{#2 \includegraphics[]{\usebox{\tmp}}}
}
\begin{document}
\hrefqr{www.example.com}{This is example.com}
\end{document}

从日志中:

\write->qrencode www.example.com -o \usebox {\tmp }

\usebox ->\protect \usebox  

\usebox  #1->\leavevmode \copy #1\relax 
#1<-\tmp 

\leavevmode ->\unhbox \voidb@x 
runsystem(qrencode www.example.com -o \protect \unhbox \voidb@x \copy \tmp \rel
ax )...executed safely (allowed).

然后:

! LaTeX Error: File `\usebox {\tmp }' not found.

来自以下扩展:

#1<-This is example.com \includegraphics []{\usebox {\tmp }}

我究竟做错了什么?

答案1

您不能将文本存储在框中并通过宏扩展检索它。当您这样做时,\savebox{\tmp}{some text}参数存储在框寄存器中,如下所示已经排版

这是一个可行的实现。我创建一个目录,而不是一个文件,并在其中创建temp.png,否则\includegraphics将无法确定其大小。请参阅https://stackoverflow.com/a/59638023

如果你的版本mktemp支持-suffix,你可以使用它,详细信息请参阅后面。

\documentclass{article}
\usepackage{catchfile}
\usepackage{graphicx}
\usepackage{hyperref}

\ExplSyntaxOn

\NewDocumentCommand{\hrefqr}{mO{}m}
 {
  % get the name of a temporary file
  \sys_get_shell:nnN { mktemp ~ -d } { } \l_tmpa_tl
  \tl_trim_spaces:N \l_tmpa_tl
  % build the QRcode
  \sys_shell_now:x { qrencode ~ #1 ~ -o ~ \l_tmpa_tl/temp.png }
  %
  \href { #1 } { #3 ~ \includegraphics[#2]{ \l_tmpa_tl/temp.png } }
 }

\ExplSyntaxOff

\begin{document}

\hrefqr{www.example.com}{This is example.com}

\hrefqr{www.example.com}[scale=0.5]{This is example.com}

\end{document}

在此处输入图片描述

在我的系统上,mktemp不支持--suffix,但gmktemp(作为的一部分与 Homebrew 一起安装coreutils)支持。

\documentclass{article}
\usepackage{catchfile}
\usepackage{graphicx}
\usepackage{hyperref}

\ExplSyntaxOn

\NewDocumentCommand{\hrefqr}{mO{}m}
 {
  % get the name of a temporary file
  \sys_get_shell:nnN { gmktemp ~ --suffix ~.png } { } \l_tmpa_tl
  \tl_trim_spaces:N \l_tmpa_tl
  % build the QRcode
  \sys_shell_now:x { qrencode ~ #1 ~ -o ~ \l_tmpa_tl }
  %
  \href { #1 } { #3 ~ \includegraphics[#2]{ \l_tmpa_tl } }
 }

\ExplSyntaxOff

\begin{document}

\hrefqr{www.example.com}{This is example.com}

\hrefqr{www.example.com}[scale=0.5]{This is example.com}

\end{document}

相关内容