Expandieren eines Befehls direkt bei Definition.

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Expandieren eines Befehls direkt bei Definition.

Danke

von mathe42 » Fr 15. Dez 2017, 11:54

Danke, damit hast du mir sehr geholfen...

Gruß
Sebastian

von Gast » Fr 15. Dez 2017, 08:10

Zunächst einmal musst Du für die Umdefinierung natürlich \renewcommand an Stelle von \newcommand verwenden. Dann willst Du die Expansion von \(re)newcommand nicht nur bis nach dem Einlesen der geschweiften Klammer von \test verzögern, sondern bis zur Expansion von \currfilename. Also muss eine entsprechende \expandafter-Kette aufgespannt werden:
\begin{filecontents*}{\jobname-test.tex}
\setFileName
\end{filecontents*}
\documentclass{scrartcl}
\usepackage{currfile}

\newcommand{\test}{Kein Speicherpunkt gesetzt.}
\newcommand\setFileName{%
  \expandafter\renewcommand\expandafter\test\expandafter{\currfilename}%
}

\begin{document}
   \input{\jobname-test.tex}
   \test
\end{document}
Da wir uns mit \expandafter aber ohnehin bereits von der LaTeX- auf die TeX-Ebene begeben und mit dem vorherigen \newcommand bereits sichergestellt ist, dass \test uns gehört, können wir auch die Definition auf TeX-Ebene vornehmen:
\begin{filecontents*}{\jobname-test.tex}
\setFileName
\end{filecontents*}
\documentclass{scrartcl}
\usepackage{currfile}

\newcommand{\test}{Kein Speicherpunkt gesetzt.}
\newcommand\setFileName{%
  \edef\test{\currfilename}%
}

\begin{document}
   \input{\jobname-test.tex}
   \test
\end{document}
\edef führt bei der Definition eine vollständiges Expansion durch. Da hier das Argument der Definition nur aus einem einzigen Makro besteht, kann alternativ auch \let verwendet werden:
\begin{filecontents*}{\jobname-test.tex}
\setFileName
\end{filecontents*}
\documentclass{scrartcl}
\usepackage{currfile}

\newcommand{\test}{Kein Speicherpunkt gesetzt.}
\newcommand\setFileName{%
  \let\test\currfilename
}

\begin{document}
   \input{\jobname-test.tex}
   \test
\end{document}
\let weist einem Argument den Wert eines Tokens zu. Daher darf man an der Stelle auch auf keinen Fall \currfilename in geschweifte Klammern setzen. \test würde sonst zu { und \test} wäre dann quasi übrig.

Bezüglich der zusätzlich eingefügten % beachte bitte: https://komascript.de/signifikanteLeerzeichen.

Expandieren eines Befehls direkt bei Definition.

von mathe42 » Fr 15. Dez 2017, 05:22

Hallo,
Ich versuche den Dateinamen der benutzten Datei in einem Befehl zu speichern. Dabei muss der \currfilename Befehl aber direkt expandiert werden, da ich den Dateinamen in einer Anderen Datei verwenden möchte.

Wie ist das möglich?


main.tex:
\documentclass{scrartcl}
\usepackage{currfile}

\newcommand{\test}{Kein Speicherpunkt gesetzt.}
\newcommand\setFileName{
   \expanafter\renewcommand{\test}{\currfilename}
}

\begin{document}
   \input{test.tex}
   \test
\end{document}
test.tex:
\setFileName
Gruß
Sebastian

Nach oben