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
,因此您必须重新定义后者以使用新语法。
该
listings
包不提供任何宏来重新定义环境;因此,您必须LTXexample
“手动”取消定义环境:\let\LTXexample\undefined \let\LTXexample@\undefined
您现在可以重新定义后者以使用
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}