我如何更改 showexpl 的图形键的语法?

我如何更改 showexpl 的图形键的语法?

graphic我正在尝试重写包中的选项showexpl,我已经查看了源代码,showexpl.sty但找不到修改、包使用keyval(或 xkeyval)以及listings图形命令的定义(对我来说太混乱了)。我的想法是这样的,默认定义是:

graphic={[option]path/to/image}

我想将其更改为:

graphic={option}{path/to/image}

有可能改变这个吗?

问候,

巴勃罗

编辑:showexpl.sty以下是我尝试修改的最新行:

% lines 66 - 72
\newcommand*\SX@graphicname{}%
\newcommand*\SX@graphicparam{}%
\lst@Key{graphic}{}[]{%
  \lstKV@OptArg[width=\linewidth]{#1}{%
    \edef\SX@graphicparam{##1}\edef\SX@graphicname{##2}%
  }%
}%

我尝试修改@Key...没有成功

% lines 170 - 189
\lstnewenvironment{LTXexample}[1][]
{%
  \@temptokena{#1}%
  \begingroup
    \advance\c@ltxexample\@ne \advance\c@lstlisting\@ne
    \expandafter\lstset\expandafter{\SX@explpreset,#1}%
    \edef\x{\endgroup
      \def\noexpand\SX@codefile{\SX@codefile}%
      \def\noexpand\SX@graphicname{\SX@graphicname}%
      \def\noexpand\SX@graphicparam{\SX@graphicparam}}%
  \x
  \xdef\SX@@explpreset{\the\@temptokena,codefile=\SX@codefile,
    graphic={[\SX@graphicparam]{\SX@graphicname}}}%
  \setbox\@tempboxa=\hbox\bgroup% Warum noetig?
  \lst@BeginWriteFile{\SX@codefile}%
}
{%
  \lst@EndWriteFile\egroup
  \SX@put@code@result
}

更改线路graphic={\SX@graphicparam}{\SX@graphicname}}不起作用...和MWE(用于声明):

\documentclass{article}
\usepackage[demo]{graphicx}
\usepackage{showexpl}
\begin{document}
\begin{LTXexample}[graphic={[width=5cm]demo}]
change 
graphic={[width=5cm]demo}
to 
graphic={width=5cm}{demo}
\end{LTXexample}
\end{document}

答案1

虽然这是可能的(见下文),但我不确定你为什么要改变键的语法graphic...使用你建议的语法,以前的可选参数将变成必需的。你确定这真的是你想要的吗?


首先,让graphic密钥接受其参数为

graphic={option}{path/to/image}

代替

graphic={[option]path/to/image}

您需要使用listings内部宏来重新定义该键,\lstKV@TwoArg而不是\lstKV@OptArg

\lst@Key{graphic}{}[]{%
  \lstKV@TwoArg{#1}{%
    \edef\SX@graphicparam{##1}\edef\SX@graphicname{##2}%
  }%
}%

graphic然后,由于在环境定义中使用了键的旧语法LTXexample,因此您必须重新定义后者以使用新语法。

  1. listings包不提供任何宏来重新定义环境;因此,您必须LTXexample“手动”取消定义环境:

    \let\LTXexample\undefined
    \let\LTXexample@\undefined
    
  2. 您现在可以重新定义后者以使用graphic键的新语法:

    ...
    \xdef\SX@@explpreset{\the\@temptokena,codefile=\SX@codefile,
      graphic={\SX@graphicparam}{\SX@graphicname}}%
    ...
    

在此处输入图片描述

完整代码

\documentclass{article}

\usepackage[demo]{graphicx}
\usepackage{showexpl}

\makeatletter

% redefinition of showexpl's graphic key
% so that the syntax be {...}{...} instead of {[...]{...}}
\lst@Key{graphic}{}[]{%
  \lstKV@TwoArg{#1}{%
    \edef\SX@graphicparam{##1}\edef\SX@graphicname{##2}%
  }%
}%

% `undefinition' of LTXexample environment
\let\LTXexample\undefined
\let\LTXexample@\undefined

% redefinition of the LTXexample environment
% with the new syntax of the graphic key
\lstnewenvironment{LTXexample}[1][]
{%
  \@temptokena{#1}%
  \begingroup
    \advance\c@ltxexample\@ne \advance\c@lstlisting\@ne
    \expandafter\lstset\expandafter{\SX@explpreset,#1}%
    \edef\x{\endgroup
      \def\noexpand\SX@codefile{\SX@codefile}%
      \def\noexpand\SX@graphicname{\SX@graphicname}%
      \def\noexpand\SX@graphicparam{\SX@graphicparam}}%
  \x
  \xdef\SX@@explpreset{\the\@temptokena,codefile=\SX@codefile,
    graphic={\SX@graphicparam}{\SX@graphicname}}%
  \setbox\@tempboxa=\hbox\bgroup%
  \lst@BeginWriteFile{\SX@codefile}%
}
{%
  \lst@EndWriteFile\egroup
  \SX@put@code@result
}
\makeatother

\begin{document}
\begin{LTXexample}[graphic={width=5cm}{demo}]
change 
graphic={[width=5cm]demo}
to 
graphic={width=5cm}{demo}
\end{LTXexample}
\end{document}

编辑(根据 OP 的评论)

如果需要,您可以基于密钥LTXexample的自定义语法定义新环境graphic。但是,如果您尝试同时使用新环境,并且LTXexample后者仍然依赖于旧graphic语法,那么您将遇到麻烦。一种解决方法是定义新密钥(称为mygraphic下面)而不是重新定义graphic密钥。

\documentclass{article}

\usepackage[demo]{graphicx}
\usepackage{showexpl}

\makeatletter


% definition of a new key based on showexpl's graphic key
% but those syntax is {...}{...} instead of {[...]{...}}
\lst@Key{mygraphic}{}[]{%
  \lstKV@TwoArg{#1}{%
    \edef\SX@graphicparam{##1}\edef\SX@graphicname{##2}%
  }%
}%

% definition of a new environment based on LTXexample
% but using the new syntax of the graphic key
\lstnewenvironment{MYexample}[1][]
{%
  \@temptokena{#1}%
  \begingroup
    \advance\c@ltxexample\@ne \advance\c@lstlisting\@ne
    \expandafter\lstset\expandafter{\SX@explpreset,#1}%
    \edef\x{\endgroup
      \def\noexpand\SX@codefile{\SX@codefile}%
      \def\noexpand\SX@graphicname{\SX@graphicname}%
      \def\noexpand\SX@graphicparam{\SX@graphicparam}}%
  \x
  \xdef\SX@@explpreset{\the\@temptokena,codefile=\SX@codefile,
    mygraphic={\SX@graphicparam}{\SX@graphicname}}%
  \setbox\@tempboxa=\hbox\bgroup%
  \lst@BeginWriteFile{\SX@codefile}%
}
{%
  \lst@EndWriteFile\egroup
  \SX@put@code@result
}
\makeatother

\begin{document}
\begin{MYexample}[mygraphic={width=5cm}{demo}]
change 
graphic={[width=5cm]demo}
to 
graphic={width=5cm}{demo}
\end{MYexample}

\begin{LTXexample}[pos=r]
change graphic={[width=5cm]demo}
to
graphic={width=5cm}{demo}
\end{LTXexample}
\end{document}

相关内容