I'm trying to create a package with a single option, which provides an environment, which behaves differently if called by latex or pdflatex XeLaTeX. I tried to use kvoptions, but I'm a little lost.
Suppose that the package name is "myexample" with the only option [pdf] and an environment called "example". The idea is as follows:
- If I load the package without options, and run XeLaTeX Latex or the environment "example" works in one way, and you can not use this if you run pdflatex or lualatex.
- If I load the package with [pdf] and run pdflatex or lualatex or XeLaTeX, the environment "example" works differently, and you can not use this if you run LaTeX
I read some forum and I think the solution is to use "kvoptions" and "ifpdf, ifluatex, ifxetex".
The code I have is as follows:
\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}
Is it possible to do this?
I appreciate the comments and help.
Pablo
EDIT 1: Update the code using the idea proposed by @Marco Daniel, but I'm still lost, insert the code, but does not do what I want. Let me explain:
The "example" environment has two definitions
-
no options(default)
\tcbset{below/.style={colback=white,text and listing},myexample/.style={colframe=gray}}%
\newtcblisting{example}[1]{myexample,#1}
should be defined only for LaTeX and XeLaTeX, and give an error message if used (pdf|lua)LaTeX. -
option [pdf]
\tcbset{below/.style={colback=red,sidebyside},myexample/.style={colframe=blue}}%
\newtcolorbox{example}[1]{myexample,#1}
should be defined only (Xe|pdf|lua) LaTeX and give an error message if used LaTeX whit this option.
EDIT 2: This works (based on @Marco Daniel solution), leave it as it is useful to a user:
\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}
Best Answer
Here a suggestion for you package. I think every important fact is written as a comment :