在环境结束时使用带有可选参数的 includegraphics

在环境结束时使用带有可选参数的 includegraphics

我正在尝试定义一个环境,该环境调用外部命令根据环境的内容绘制 pdf,并包含输出。

现在我还希望能够将宽度和比例选项传递给\includegraphics环境结束函数内的宏,但我无法让它以\includegraphics它仍然可以理解的方式传递参数。

下面的小示例以以下错误结束:

Package keyval Error: scale=1 undefined.

类似地,如果我尝试传递width=0.5\textwidth到环境,它就会中断:

! Missing \endcsname inserted.
<to be read again> 
                   \textwidth 
l.32 \end{haslpicture}

小例子(本例中 cupsfilter 是外部命令)

\documentclass{minimal}
\usepackage{environ}
\usepackage{graphicx}

\newwrite\myOutput
\makeatletter

\def\hasl@writeToFile#1{
  \immediate\openout\myOutput=\[email protected]%
  \immediate\write\myOutput{#1}%
  \immediate\closeout\myOutput%
}

\newenvironment{haslpicture}[2][scale=1]{%
  \def\hasl@filename{#2}%
  \def\hasl@arguments{#1}%
  \newlinechar`\^^M%
  \obeylines%
  \message{Optional argument: #1}
  \Collect@Body\hasl@writeToFile% %macro from the environ package
}{%
  \immediate\write18{cupsfilter \[email protected] > \[email protected]}%
  \includegraphics[\hasl@arguments]{\[email protected]}
}
\makeatother

\begin{document}
\begin{haslpicture}[scale=1]{xoutput}
one
two
three
\end{haslpicture}
\end{document}

答案1

语法字符=,不得隐藏在键值列表中。通过扩展来修复\hasl@arguments

\expandafter\includegraphics\expandafter[\hasl@arguments]{\[email protected]}

答案2

xparse也可以在“结束部分”使用这些参数。

\documentclass{article}
\usepackage{xparse}
\usepackage{environ}
\usepackage{graphicx}

\ExplSyntaxOn

\iow_new:N \g_jelmervdl_haslpicture_stream

\cs_new_protected:Nn \jelmervdl_haslpicture_write:n
 {
  \iow_open:NV \g_jelmervdl_haslpicture_stream \l__jelmervdl_haslpicture_name_tl
  \iow_now:Nf \g_jelmervdl_haslpicture_stream { \tl_trim_spaces:n { #1 } }
  \iow_close:N \g_jelmervdl_haslpicture_stream
 }
\cs_generate_variant:Nn \iow_open:Nn { NV }
\cs_generate_variant:Nn \iow_now:Nn { Nf }

\NewDocumentEnvironment{haslpicture}{O{}m}
 {
  \tl_set:Nn \l__jelmervdl_haslpicture_name_tl { #2.txt }
  \endlinechar=`\^^J \scan_stop:
  \use:c { Collect@Body } \jelmervdl_haslpicture_write:n
 }
 {
  \message{Optional~argument:~#1}
  \sys_shell_now:n { cupsfilter ~ #2.txt ~ > ~ #2.pdf }
  \includegraphics[#1]{#2.pdf}
 }
\ExplSyntaxOff

\begin{document}

\begin{haslpicture}[scale=1]{xoutput}
one
two
three
\end{haslpicture}

\end{document}

与其玩弄\obeylines,不如将其设置\endlinechar^^J,这是 LaTeX 中默认的换行符。

相关内容