我正在尝试创建一个具有单个选项的包,该选项提供了一个环境,如果由 latex 或 pdflatex XeLaTeX 调用,其行为会有所不同。我尝试使用 kvoptions,但有点迷茫。假设包名称为“myexample”,其中只有选项 [pdf] 和一个名为“example”的环境。想法如下:
- 如果我加载没有选项的包,并运行 XeLaTeX Latex 或环境“示例”以一种方式工作,并且如果您运行 pdflatex 或 lualatex 则无法使用它。
- 如果我用 [pdf] 加载包并运行 pdflatex 或 lualatex 或 XeLaTeX,环境“示例”的工作方式会有所不同,如果你运行 LaTeX,则无法使用它
我读了一些论坛,我认为解决方案是使用“kvoptions”和“ifpdf、ifluatex、ifxetex”。我的代码如下:
\RequirePackage{filecontents}
\begin{filecontents}{myexample.sty}
\NeedsTeXFormat{LaTeX2e}
\def\filedate{2013/11/22}
\def\fileversion{v0.1}
\ProvidesPackage{myexample}[\filedate\space\fileversion\space]
\RequirePackage{ifpdf,ifluatex,ifxetex}
\RequirePackage{kvoptions}
\usepackage{tcolorbox}
\tcbuselibrary{listings,breakable,skins}
\SetupKeyvalOptions{
family=@pste,
prefix=@pste@
}
% This option for latex|xelatex.(default)
\DeclareBoolOption[true]{latex}
% This option for pdflatex|lualatex|xelatex.
\DeclareBoolOption{pdf}
\ProcessKeyvalOptions*
% Its no option examples is newtcblisting for latex|xelatex
\if@pste@latex%
\tcbset{below/.style={colback=white,text and listing},myexample/.style={colframe=gray}}%
\newtcblisting{example}[1]{myexample,#1}
% if [pdf] option if true, example is newcolorbox for pdflatex|lualatex|xelatex
\if@pste@pdf%
\ifpdf
\tcbset{below/.style={colback=red,sidebyside},myexample/.style={colframe=blue}}%
\newtcolorbox{example}[1]{myexample,#1}
\else
\fi
\fi
\end{filecontents}
\documentclass{article}
\usepackage[pdf]{myexample}
\begin{document}
\begin{example}{below}
Text
\end{example}
\end{document}
可以这样做吗?我很感谢你的评论和帮助。Pablo
编辑1:使用@Marco Daniel 提出的想法更新代码,但我仍然迷茫,插入代码,但没有达到我想要的效果。让我解释一下:
“示例”环境有两个定义
无选项(默认)
\tcbset{below/.style={colback=white,text and listing},myexample/.style={colframe=gray}}% \newtcblisting{example}[1]{myexample,#1} 应仅针对 LaTeX 和 XeLaTeX 定义,并且如果使用 (pdf|lua)LaTeX 则给出错误消息。
选项 [pdf]
\tcbset{below/.style={colback=red,sidebyside},myexample/.style={colframe=blue}}% \newtcolorbox{example}[1]{myexample,#1} 应仅定义 (Xe|pdf|lua) LaTeX,并且如果使用带有此选项的 LaTeX 则会给出错误消息。
编辑2:这是有效的(基于@Marco Daniel 解决方案),保留它,因为它对用户有用:
\RequirePackage{filecontents}
\begin{filecontents}{myexample.sty}
\NeedsTeXFormat{LaTeX2e}
\def\filedate{2013/11/24}
\def\fileversion{v0.2}
\ProvidesPackage{myexample}[\filedate\space\fileversion\space]
\RequirePackage{ifpdf,ifluatex,ifxetex}
\RequirePackage{kvoptions}
\RequirePackage{etoolbox}
\RequirePackage{tcolorbox}
\tcbuselibrary{listings,breakable,skins}
\SetupKeyvalOptions{
family=@pste,
prefix=@pste@
}
\DeclareBoolOption{pdf}% default is false
\ProcessKeyvalOptions*
\def\@pste@compile@noexample{}% do what you want
\def\@pste@compile@pdftrue{}% do what you want
\def\@pste@compile@pdffalse{}% do what you want
% if package load [pdf] option, example enviroment is a newtcolorbox for (xe/lua/pdf)latex
% and not defined for standar latex
\if@pste@pdf%
\ifboolexpr{ bool {pdf} or bool {xetex} or bool {luatex} }%
{% (xe/lua/pdf)latex is true
\@pste@compile@pdftrue
\tcbset{below/.style={colback=blue!50!white},myexample/.style={colframe=gray}}
\newtcolorbox{example}[1]{myexample,#1}
}%
{% If use (pdf/lua) latex whitout [pdf] show error
\@pste@compile@noexample%
\PackageError{mysty}{%
\MessageBreak%
Not use option [pdf] for example enviroment in LaTeXenviroment \MessageBreak%
}
}%
\else%
% if load whitout [pdf] (no option given) example enviroment is a newtcblisting for (xe/la)tex %
% and disable for (xe/lua/pdf)latex
\ifboolexpr{not bool {pdf}}%
{% xelatex or latex is true
\@pste@compile@pdftrue
\tcbset{below/.style={colback=gray!50!white,text and listing},myexample/.style={colframe=gray}}
\newtcblisting{example}[1]{myexample,#1}
}%
{% If use (pdf/lua) latex whitout [pdf] show error
% no example environment
\@pste@compile@noexample%
\PackageError{mysty}{%
\MessageBreak%
Need option [pdf] for example enviroment \MessageBreak%
}
}%
\fi
\end{filecontents}
\documentclass{article}
\usepackage[pdf]{myexample}
\begin{document}
\begin{example}{below}
This is \TeX\ upper
\tcblower
This is \TeX\ lower
\end{example}
\end{document}
答案1
这里有一个针对您的软件包的建议。我认为每个重要事实都写成了注释:
\begin{filecontents}{myexample.sty}
\NeedsTeXFormat{LaTeX2e}
\def\filedate{2013/11/22}
\def\fileversion{v0.1}
\ProvidesPackage{myexample}[\filedate\space\fileversion\space]
\RequirePackage{ifpdf,ifluatex,ifxetex}
\RequirePackage{kvoptions}
\RequirePackage{etoolbox}
\RequirePackage{tcolorbox}
\tcbuselibrary{listings,breakable,skins}
\SetupKeyvalOptions{
family=@pste,
prefix=@pste@
}
\DeclareBoolOption{pdf}%default is false
\ProcessKeyvalOptions*
\def\@pste@compile@noexample{}%do what you want
\def\@pste@compile@pdftrue{}%do what you want
\def\@pste@compile@pdffalse{}%do what you want
% Its no option examples is newtcblisting for latex|xelatex
\if@pste@pdf%
%option pdf is set true
\ifboolexpr{ not bool {pdf} }%
{% xelatex or latex is true
\@pste@compile@pdftrue
}%
{%otherwise
%no example environment
\@pste@compile@noexample%
}%
\else%
%\option pdf is set false / no option given
\ifboolexpr{ bool {pdf} or bool {xetex} or bool {luatex} }%
{%pdflatex or xelatex or lualatex is true
\@pste@compile@pdftrue
}%
{%otherwise
%no example environment
\@pste@compile@noexample%
}%
\fi
\end{filecontents}