我正在尝试存储 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}