Holger Schieferdecker
2020-10-28 08:13:28 UTC
Hallo,
ein Makro in einem Paket soll ein optionales key-value-Argument
auswerten, mit dem ggf. einmalig im Makro die zugehörigen globalen
Paketoptionen überschrieben werden können. Meine Idee war, innerhalb
\setkeys zunächst den lokalen key mit dem value der globalen Paketoption
zu setzen und danach das optionale Argument auszuwerten. Insgesamt habe
ich 3 verschiedene keys, der Test ist aber nur mit einem gemacht.
Das funktioniert auch, aber nur mit \setkeys*, nicht mit \setkeys. Ohne
Stern erhalte ich den Fehler
Package xkeyval Error: `showfilename=false' undefined in families
`TRtogglesIB'.
Wenn danach aber in #1 `showfilename=false' steht, scheint das kein
Problem mehr zu sein.
Eigentlich dachte ich, der Unterschied von \setkeys* bestünde darin, bei
unbekannten keys keinen Fehler zu melden. Aber ich verwende doch nur den
bekannten key, oder etwa nicht?
Klar, mit * funktioniert es, aber ich habe das dumpfe Gefühl, etwas noch
nicht ganz richtig zu machen. Es wäre schön, wenn da jemand Licht ins
Dunkel bringen könnte.
Wäre es evtl. besser, vor dem \setkeys die entsprechenden ifs der
lokalen boolkeys direkt auf den Wert der globalen Optionen zu setzen und
dann nur \IfValueT{#1}{\setkeys{#1}} auszuführen?
Holger
%%%% trpaket.sty %%%%
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{trpaket}[2020/10/27 v0.1 Travelreport argument test]
\RequirePackage{xkeyval} %% Extended key-value arguments
\RequirePackage{xparse} %% Extended macro definitions
\RequirePackage{etoolbox} %% Misc stuff, bool variables, toggles
% global boolkey
\***@boolkey[HGS-TR]{TRtoggles}[TR@]{showimagefilenames}[true]{}
% boolkey for local use as macro option
\***@boolkey[HGS-TR]{TRtogglesIB}[***@ib@]{showfilename}[true]{}
% set default value for global key
\presetkeys[HGS-TR]{TRtoggles}{
showimagefilenames=false,
}{}
% Macro to set values of keys independent of package loading
\newcommand*{\TRsetup}[1]{%
\setkeys[HGS-TR]{TRtoggles}{#1}%
}
% Process package options
\ProcessOptionsX[HGS-TR]<TRtoggles>
% Macro for big images
\NewDocumentCommand{\TRimageBig}{ o m O{} }{%
% process local options
\setkeys*[HGS-TR]{TRtogglesIB}{% <-- removing the star causes an error
\ifbool{***@showimagefilenames}{showfilename}{showfilename=false},
%\IfValueT{#1}{#1}% Does not work
#1
}%
% Test output
#1\newline
\***@showimagefilenames
global showimagefilenames=true
\else
global showimagefilenames=false
\fi
\newline
\***@ib@showfilename
local showfilename=true
\else
local showfilename=false
\fi
}
\endinput
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% trargtext.tex %%%%
\documentclass[parskip=half-]{scrartcl}
\usepackage{trpaket}
\begin{document}
no arg:\newline
\TRimageBig{foo}
arg true:\newline
\TRimageBig[showfilename]{foo}
arg false:\newline
\TRimageBig[showfilename=false]{foo}
---
\TRsetup{showimagefilenames}
no arg:\newline
\TRimageBig{foo}
arg true:\newline
\TRimageBig[showfilename]{foo}
arg false:\newline
\TRimageBig[showfilename=false]{foo}
\end{document}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ein Makro in einem Paket soll ein optionales key-value-Argument
auswerten, mit dem ggf. einmalig im Makro die zugehörigen globalen
Paketoptionen überschrieben werden können. Meine Idee war, innerhalb
\setkeys zunächst den lokalen key mit dem value der globalen Paketoption
zu setzen und danach das optionale Argument auszuwerten. Insgesamt habe
ich 3 verschiedene keys, der Test ist aber nur mit einem gemacht.
Das funktioniert auch, aber nur mit \setkeys*, nicht mit \setkeys. Ohne
Stern erhalte ich den Fehler
Package xkeyval Error: `showfilename=false' undefined in families
`TRtogglesIB'.
Wenn danach aber in #1 `showfilename=false' steht, scheint das kein
Problem mehr zu sein.
Eigentlich dachte ich, der Unterschied von \setkeys* bestünde darin, bei
unbekannten keys keinen Fehler zu melden. Aber ich verwende doch nur den
bekannten key, oder etwa nicht?
Klar, mit * funktioniert es, aber ich habe das dumpfe Gefühl, etwas noch
nicht ganz richtig zu machen. Es wäre schön, wenn da jemand Licht ins
Dunkel bringen könnte.
Wäre es evtl. besser, vor dem \setkeys die entsprechenden ifs der
lokalen boolkeys direkt auf den Wert der globalen Optionen zu setzen und
dann nur \IfValueT{#1}{\setkeys{#1}} auszuführen?
Holger
%%%% trpaket.sty %%%%
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{trpaket}[2020/10/27 v0.1 Travelreport argument test]
\RequirePackage{xkeyval} %% Extended key-value arguments
\RequirePackage{xparse} %% Extended macro definitions
\RequirePackage{etoolbox} %% Misc stuff, bool variables, toggles
% global boolkey
\***@boolkey[HGS-TR]{TRtoggles}[TR@]{showimagefilenames}[true]{}
% boolkey for local use as macro option
\***@boolkey[HGS-TR]{TRtogglesIB}[***@ib@]{showfilename}[true]{}
% set default value for global key
\presetkeys[HGS-TR]{TRtoggles}{
showimagefilenames=false,
}{}
% Macro to set values of keys independent of package loading
\newcommand*{\TRsetup}[1]{%
\setkeys[HGS-TR]{TRtoggles}{#1}%
}
% Process package options
\ProcessOptionsX[HGS-TR]<TRtoggles>
% Macro for big images
\NewDocumentCommand{\TRimageBig}{ o m O{} }{%
% process local options
\setkeys*[HGS-TR]{TRtogglesIB}{% <-- removing the star causes an error
\ifbool{***@showimagefilenames}{showfilename}{showfilename=false},
%\IfValueT{#1}{#1}% Does not work
#1
}%
% Test output
#1\newline
\***@showimagefilenames
global showimagefilenames=true
\else
global showimagefilenames=false
\fi
\newline
\***@ib@showfilename
local showfilename=true
\else
local showfilename=false
\fi
}
\endinput
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% trargtext.tex %%%%
\documentclass[parskip=half-]{scrartcl}
\usepackage{trpaket}
\begin{document}
no arg:\newline
\TRimageBig{foo}
arg true:\newline
\TRimageBig[showfilename]{foo}
arg false:\newline
\TRimageBig[showfilename=false]{foo}
---
\TRsetup{showimagefilenames}
no arg:\newline
\TRimageBig{foo}
arg true:\newline
\TRimageBig[showfilename]{foo}
arg false:\newline
\TRimageBig[showfilename=false]{foo}
\end{document}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%