Nutzung von Variablen innerhalb eines Dokument

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: Nutzung von Variablen innerhalb eines Dokument

von Besserwisser » Mo 21. Sep 2015, 07:45

matze hat geschrieben:Könnte ich also auch den ersten Teil zum Anlegen der tex-Datei weglassen und eine beliebige tex-Datei mit entsprechenden Platzhaltern für die Variablen vorbereiten und nutzen?
Logisch. Für ein vollständiges Minimalbeispiel aber wenig sinnvoll. Und solche Dinge kann man einfach ausprobieren. Die muss man nicht fragen.
matze hat geschrieben:Warum werden die newcommand* nach den renewcommand gesetzt (Zufall oder gewollt?)?
Das ist Jacke wie Hose. Verwendet werden die ja erst beim Laden der entsprechenden Datei. Für TeX ist es egal, ob du
\newcommand*{\A}{B}
\newcommand*{\B}{\A}
schreibst oder
\newcommand*{\B}{\A}
\newcommand*{\A}{B}
Du darfst nur weder \A noch \B verwenden, bevor \A definiert ist.

Das ist auch nicht wirklich schwer zu verstehen. Man muss sich einfach nur daran gewöhnen, dass TeX eine Makrosprache ist, also die Definition eines Makros schlicht dann eingesetzt wird, wenn das Makro tatsächlich verwendet (im TeX-Jargon: expandiert) wird. Du darfst deshalb auch so Dinge machen wie:
\documentclass{article}
\newcommand*{\A}{\undefined}
\renewcommand*{\A}{Das geht!}
\begin{document}
\A
\end{document}
Das geht erst schief, wenn du die dritte Zeile auskommentierst. Es geht aber auch dann nicht in der zweiten Zeile schief, sondern erst in der fünften, weil erst dort \A expandiert wird.

von matze » So 20. Sep 2015, 13:59

Meine Nachfrage nur zum Verständnis deines Beispiels:
\begin{filecontents}{VerschFormText.tex}
\section{Verschieden formatierte Texte}
Hier wird \textbf{fett}, {\Large groß} bzw. \textit{kursiv} formatierter Text eingefügt:

\textbf{\FargA}

{\Large \FargB\par}

\textit{\FargC}
\end{filecontents}
Hier wird die Datei VerschFormText.tex mit dem Textinhalt angelegt.
\newcommand{\LoadFileWithIIIArgs}[4]{%
  \begingroup
    \renewcommand{\FargA}{#2}%
    \renewcommand{\FargB}{#3}%
    \renewcommand{\FargC}{#4}%
    \input{#1}%
  \endgroup
}
Hier wird der Befehl angelegt, um die Datei aufzurufen und die entsprechenden default-Werte der Variablen zu überschreiben?
\newcommand*{\FargA}{\verb|\FargA| bitte noch setzen!}
\newcommand*{\FargB}{\verb|\FargA| bitte noch setzen!}
\newcommand*{\FargC}{\verb|\FargA| bitte noch setzen!}
Damit werden Befehle für die einzelnen Variablen angelegt und mit einem default-Wert gefüllt?
\begin{document}
\LoadFileWithIIIArgs{VerschFormText.tex}
                    {Ich bin fett.}
                    {Ich bin groß.}
                    {Ich bin kursiv.}
\end{document}
Hier der Dateiaufruf mit den zu übergebenden Variablen.

Könnte ich also auch den ersten Teil zum Anlegen der tex-Datei weglassen und eine beliebige tex-Datei mit entsprechenden Platzhaltern für die Variablen vorbereiten und nutzen?

Warum werden die newcommand* nach den renewcommand gesetzt (Zufall oder gewollt?)?

von Besserwisser » Do 17. Sep 2015, 14:23

Im Vergleich beispielsweise zu \maketitle-Definition in KOMA-Script oder memoir ist das ja noch eher klein. Grundsätzlich muss man natürlich bedenken, dass Makro-Definition die statischen Speicher-Arrays von PDFTeX oder XeTeX belasten. Die sind inzwischen aber so groß, dass man da viele KByte an Daten unterbringen kann.

Eher ein Problem bei deinem Beispiel ist, dass die \Large-Gruppe zu früh geschlossen wird. Da TeX die für den Absatzumbruch die Einstellungen am ende des Absatzes verwendet, solltest du besser
{\Large #2\par}
verwenden.

Eine Alternative wäre:
\documentclass[12pt,parskip=full]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{filecontents}
\begin{filecontents}{VerschFormText.tex}
\section{Verschieden formatierte Texte}
Hier wird \textbf{fett}, {\Large groß} bzw. \textit{kursiv} formatierter Text eingefügt:

\textbf{\FargA}

{\Large \FargB\par}

\textit{\FargC}
\end{filecontents}

\newcommand{\LoadFileWithIIIArgs}[4]{%
  \begingroup
    \renewcommand{\FargA}{#2}%
    \renewcommand{\FargB}{#3}%
    \renewcommand{\FargC}{#4}%
    \input{#1}%
  \endgroup
}
\newcommand*{\FargA}{\verb|\FargA| bitte noch setzen!}
\newcommand*{\FargB}{\verb|\FargA| bitte noch setzen!}
\newcommand*{\FargC}{\verb|\FargA| bitte noch setzen!}

\begin{document}
\LoadFileWithIIIArgs{VerschFormText.tex}
                    {Ich bin fett.}
                    {Ich bin groß.}
                    {Ich bin kursiv.}
\end{document}
Ebenfalls zu überlegen wäre, eine key=value-Schnittstelle für die Parameter zu verwenden oder so etwas wie die Variablen von scrletter.

Nutzung von Variablen innerhalb eines Dokument

von matze » Do 17. Sep 2015, 13:35

Ich habe mir in einem Dokument einen neuen Befehl angelegt und diesen mit verschiedenen Bausteinen (Text, Tabellen usw.) und Variablen "gefüllt".
Im selben Dokument rufe ich dann den Befehl auf und übergebe den Inhalt für die entsprechenden Variablen.

Hier mal ein MWE:
\documentclass[12pt,parskip=full]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\newcommand{\neuesbeispiel}[3]{
\section{Verschieden formatierte Texte}
Hier wird \textbf{fett}, {\Large groß} bzw. \textit{kursiv} formatierter Text eingefügt:

\textbf{#1}

{\Large #2}

\textit{#3}
} 
 
\begin{document}
\neuesbeispiel
{Ich bin fett.}
{Ich bin groß.}
{Ich bin kursiv.}
\end{document}
Ist es überhaupt legitim, dass ich \newcommand so "umfangreich" (oder auch noch umfangreicher) nutze oder gibt es da bessere Lösungen?

Nach oben