Discussion:
xparse: Verständnisfrage \setkeys vs. \setkeys*
(zu alt für eine Antwort)
Holger Schieferdecker
2020-10-28 08:13:28 UTC
Permalink
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}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Ulrike Fischer
2020-10-30 16:12:28 UTC
Permalink
Post by Holger Schieferdecker
Hallo,
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'.
Du kannst nicht `showfilename=false` in einem Boolean verstecken.
xkeyval (und alles anderen keyval-Systeme auch) interpretieren dann
den kompletten Text als key-Name. (deswegen beklagt sich xkeyval
über "showfilename=false" und nicht über "showfilename".)

xkeyval hat vielleicht irgendwas, aber ich habe es schon lange nicht
mehr benützt. Einfach ist sowas

\ifbool{***@showimagefilenames}
{\setkeys[HGS-TR]{TRtogglesIB}{showfilename=true}}
{\setkeys[HGS-TR]{TRtogglesIB}{showfilename=false}}
Post by Holger Schieferdecker
\NewDocumentCommand{\TRimageBig}{ o m O{} }{%
Mache besser auch aus dem ersten o ein O{}.
--
Ulrike Fischer
http://www.troubleshooting-tex.de/
Holger Schieferdecker
2020-11-02 15:39:53 UTC
Permalink
Post by Ulrike Fischer
Post by Holger Schieferdecker
Hallo,
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'.
Du kannst nicht `showfilename=false` in einem Boolean verstecken.
xkeyval (und alles anderen keyval-Systeme auch) interpretieren dann
den kompletten Text als key-Name. (deswegen beklagt sich xkeyval
über "showfilename=false" und nicht über "showfilename".)
Aha, dann wird das, was \ifbool zurückliefert also anders
weiterverarbeitet als #1. Das war mir nicht klar. Danke für die Aufklärung.
Post by Ulrike Fischer
xkeyval hat vielleicht irgendwas, aber ich habe es schon lange nicht
mehr benützt. Einfach ist sowas
{\setkeys[HGS-TR]{TRtogglesIB}{showfilename=true}}
{\setkeys[HGS-TR]{TRtogglesIB}{showfilename=false}}
\NewDocumentCommand{\TRimageBig}{ O{} m O{} }{%
% set defaults for local options
\ifbool{***@showimagefilenames}
{\setkeys[HGS-TR]{TRtogglesIB}{showfilename=true}}
{\setkeys[HGS-TR]{TRtogglesIB}{showfilename=false}}
% process local options
\setkeys[HGS-TR]{TRtogglesIB}{#1}%
}

Ja, so gibt es keine Fehlermeldung mehr, danke!
Post by Ulrike Fischer
Post by Holger Schieferdecker
\NewDocumentCommand{\TRimageBig}{ o m O{} }{%
Mache besser auch aus dem ersten o ein O{}.
Stimmt, andernfalls wäre wohl ein \IfValueT{#1}{\setkyes{#1}} angebracht.

Holger

Lesen Sie weiter auf narkive:
Loading...