kvoptions 和条件环境

kvoptions 和条件环境

我正在尝试创建一个具有单个选项的包,该选项提供了一个环境,如果由 latex 或 pdflatex XeLaTeX 调用,其行为会有所不同。我尝试使用 kvoptions,但有点迷茫。假设包名称为“myexample”,其中只有选项 [pdf] 和一个名为“example”的环境。想法如下:

  1. 如果我加载没有选项的包,并运行 XeLaTeX Latex 或环境“示例”以一种方式工作,并且如果您运行 pdflatex 或 lualatex 则无法使用它。
  2. 如果我用 [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 提出的想法更新代码,但我仍然迷茫,插入代码,但没有达到我想要的效果。让我解释一下:

“示例”环境有两个定义

  1. 无选项(默认)

    \tcbset{below/.style={colback=white,text and listing},myexample/.style={colframe=gray}}% \newtcblisting{example}[1]{myexample,#1} 应仅针对 LaTeX 和 XeLaTeX 定义,并且如果使用 (pdf|lua)LaTeX 则给出错误消息。

  2. 选项 [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}

相关内容