Discussion:
Werte statt Makro übergeben (expand?)
(zu alt für eine Antwort)
Ekkart Kleinod
2021-01-05 08:28:59 UTC
Permalink
Hi Ihr,

erst mal ein schönes Neues Jahr.

Ich hab das Problem, dass ich nicht weiß, wie ich statt eines Makros den
Inhalt übergebe, zufälliges Verteilen von "expandafter" hat nicht
geholfen, ich weiß leider nicht genau, was ich damit erreiche, daher ist
das nur raten.

Kann mir da jemand helfen?

Danke,

Gruß, Ekkart.

MWE:

\documentclass{article}

\usepackage{etoolbox}

\renewcommand*{\do}[1]{\typeout{list item: '#1'}}

\typeout{direct call}
\docsvlist{list,summary}

\typeout{macro call}
\def\tempdef{list,summary}%
\docsvlist{\tempdef}

\begin{document}

Output of first call:

\begin{verbatim}
direct call
list item: 'list'
list item: 'summary'
\end{verbatim}

Output of second call:

\begin{verbatim}
macro call
list item: 'list,summary'
\end{verbatim}

How can I expand (or something like that) \texttt{tempdef} so the second
call works like the first one?

\end{document}


oder zum Download:
<https://gitlab.com/ekleinod/changes/-/tree/feature/t41-ifthenelse/testfiles/t41-ifthenelse>
Ulrike Fischer
2021-01-05 10:46:49 UTC
Permalink
Post by Ekkart Kleinod
Hi Ihr,
erst mal ein schönes Neues Jahr.
Ich hab das Problem, dass ich nicht weiß, wie ich statt eines Makros den
Inhalt übergebe, zufälliges Verteilen von "expandafter" hat nicht
geholfen, ich weiß leider nicht genau, was ich damit erreiche, daher ist
das nur raten.
Kann mir da jemand helfen?
\expandafter\docsvlist\expandafter{\tempdef}
--
Ulrike Fischer
http://www.troubleshooting-tex.de/
Ekkart Kleinod
2021-01-05 12:48:50 UTC
Permalink
Post by Ulrike Fischer
\expandafter\docsvlist\expandafter{\tempdef}
Danke Ulrike.

Und ein Schönes Neues Jahr.

Gruß, Ekkart.

PS: ist Teil davon, im changes-Paket das Paket "xifthen" loszuwerden,
wozu Du mir geraten hattest... :)
Klaus Ethgen
2021-01-06 16:21:03 UTC
Permalink
Hi Ekkart,

Ulrike hat Dir zwar schon geantwortet, aber ich kenne die Situation und
wo ein Reinstreunen von \expandafter eben nicht mehr reicht.
Post by Ekkart Kleinod
\typeout{direct call}
\docsvlist{list,summary}
\typeout{macro call}
\def\tempdef{list,summary}%
\docsvlist{\tempdef}
Die (bessere) Lösung dürfte hier sein, \edef anstelle von \def zu
verwenden.

Manchmal ist jedoch ein weiterer Schritt nötig; insbesondere, wenn
csname mit im Spiel ist. Dann hilft es, den endgültigen Ausdruck in ein
edef zu packen. (`\edef\tmp{\docsvlist{\tempdef}} \tmp` respektive
`\edef\tmp{\noexpand\docsvlist{\tempdef}} \tmp`)

-- Klaus
--
Klaus Ethgen http://www.ethgen.ch/
pub 4096R/4E20AF1C 2011-05-16 Klaus Ethgen <***@Ethgen.ch>
Fingerprint: 85D4 CA42 952C 949B 1753 62B3 79D0 B06F 4E20 AF1C
Ulrike Fischer
2021-01-07 13:24:35 UTC
Permalink
Post by Klaus Ethgen
Post by Ekkart Kleinod
\typeout{macro call}
\def\tempdef{list,summary}%
\docsvlist{\tempdef}
Die (bessere) Lösung dürfte hier sein, \edef anstelle von \def zu
verwenden.
Das macht in diesem Fall gar keinen Unterschied. \tempdef hat in
beiden Fällen den gleichen Inhalt. Probiere es aus:

\documentclass{article}
\begin{document}

\def\tempdef{list,summary}%
\show\tempdef
\edef\tempdef{list,summary}%
\show\tempdef
\end{document}
Post by Klaus Ethgen
Manchmal ist jedoch ein weiterer Schritt nötig; insbesondere, wenn
csname mit im Spiel ist. Dann hilft es, den endgültigen Ausdruck in ein
edef zu packen. (`\edef\tmp{\docsvlist{\tempdef}} \tmp` respektive
`\edef\tmp{\noexpand\docsvlist{\tempdef}} \tmp`)
\edef ist ein ziemlich brutaler Befehl. Den sollte man nur
verwenden, wenn sicher ist, dass man erstens wirklich voll
expandieren will und zweitens, dass der Inhalt das auch verträgt
(was hier der Fall ist, weil "list,summary" nur einfach Buchstaben
sind, aber dir z.B. bei \edef\tempdef{list,\textcopyright summary}%
um die Ohren fliegt).
--
Ulrike Fischer
http://www.troubleshooting-tex.de/
Klaus Ethgen
2021-01-08 08:41:04 UTC
Permalink
Hi Ulrike,
Post by Ulrike Fischer
Post by Klaus Ethgen
Post by Ekkart Kleinod
\typeout{macro call}
\def\tempdef{list,summary}%
\docsvlist{\tempdef}
Die (bessere) Lösung dürfte hier sein, \edef anstelle von \def zu
verwenden.
Das macht in diesem Fall gar keinen Unterschied. \tempdef hat in
\documentclass{article}
\begin{document}
\def\tempdef{list,summary}%
\show\tempdef
\edef\tempdef{list,summary}%
\show\tempdef
\end{document}
Post by Klaus Ethgen
Manchmal ist jedoch ein weiterer Schritt nötig; insbesondere, wenn
csname mit im Spiel ist. Dann hilft es, den endgültigen Ausdruck in ein
edef zu packen. (`\edef\tmp{\docsvlist{\tempdef}} \tmp` respektive
`\edef\tmp{\noexpand\docsvlist{\tempdef}} \tmp`)
In dem Fall geb ich Dir recht. Deswegen war ja auch mein Zusatz mit dem
\docsvlist in nen \edef zu packen.
Post by Ulrike Fischer
\edef ist ein ziemlich brutaler Befehl. Den sollte man nur
verwenden, wenn sicher ist, dass man erstens wirklich voll
expandieren will und zweitens, dass der Inhalt das auch verträgt
(was hier der Fall ist, weil "list,summary" nur einfach Buchstaben
sind, aber dir z.B. bei \edef\tempdef{list,\textcopyright summary}%
um die Ohren fliegt).
Das würde ich nun nicht erwarten... Man kann jedoch ein \noexpand davor
packen, wenn man es weiß.

Das Problem ist ja, daß die Argumente bei der Übergabe nicht (oder nicht
immer?) expandiert werden. Damit landet dann in #1 nicht nur ein Text
sondern beliebige Befehle. Das geht in vielen Fällen gut aber macht auch
immer wieder Probleme. Und dann dieses #1 so zu bearbeiten, daß man
keine Befehle mehr drin hat, ist recht unklar.

Ich hatte das Problem mal, daß ich das Ergebnis dieser Expansion ins
.aux-File schreiben mußte weil nur in dem aktuellen Kontext die Befehle
in #1 auch wirklich Sinn ergaben. Schlußendlich bin ich nur mit dem
obigen Trick über \edef weitergekommen. Noch haariger wird es, wenn man
sich einen Befehl erst mit \csname zusammenbastelt.

-- Klaus
--
Klaus Ethgen http://www.ethgen.ch/
pub 4096R/4E20AF1C 2011-05-16 Klaus Ethgen <***@Ethgen.ch>
Fingerprint: 85D4 CA42 952C 949B 1753 62B3 79D0 B06F 4E20 AF1C
Ulrike Fischer
2021-01-08 09:49:25 UTC
Permalink
Damit landet dann in #1 nicht nur ein Text sondern beliebige
Befehle. Das geht in vielen Fällen gut aber macht auch immer
wieder Probleme. Und dann dieses #1 so zu bearbeiten, daß man
keine Befehle mehr drin hat, ist recht unklar.
Das ist mir bekannt. Nur: wenn der Inhalt und sein
Expansionsverhalten unklar ist, dann ist es völlig falsch mit \edef
darauf zu schießen. LaTeX verwendet in solchen Fällen, z.B. wenn es
Überschriften in die toc-Datei schreiben muss, aus gutem Grund
\***@write und \***@edef.
--
Ulrike Fischer
http://www.troubleshooting-tex.de/
Klaus Ethgen
2021-01-08 16:26:03 UTC
Permalink
Post by Ulrike Fischer
Damit landet dann in #1 nicht nur ein Text sondern beliebige
Befehle. Das geht in vielen Fällen gut aber macht auch immer
wieder Probleme. Und dann dieses #1 so zu bearbeiten, daß man
keine Befehle mehr drin hat, ist recht unklar.
Das ist mir bekannt. Nur: wenn der Inhalt und sein
Expansionsverhalten unklar ist, dann ist es völlig falsch mit \edef
darauf zu schießen. LaTeX verwendet in solchen Fällen, z.B. wenn es
Überschriften in die toc-Datei schreiben muss, aus gutem Grund
Könntest Du das etwas näher erläutern? Ich kenne bisher ausschließlich
\***@write\@auxout{}{...} um etwas in die auxdatei zu schreiben.
Weder weiß ich, was die erste Klammer hinter auxout soll, noch, was es
sonst an Befehlen dazu gibt. Ich kämpfe mich immer da dran rum bis es
das tut, was ich mir vorstelle.

\***@edef kenne ich garnicht und was der Unterschied zu \edef ist.

-- Klaus
--
Klaus Ethgen http://www.ethgen.ch/
pub 4096R/4E20AF1C 2011-05-16 Klaus Ethgen <***@Ethgen.ch>
Fingerprint: 85D4 CA42 952C 949B 1753 62B3 79D0 B06F 4E20 AF1C
Lesen Sie weiter auf narkive:
Loading...