Nutzung von Variablen innerhalb eines Dokument

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


matze
Forum-Anfänger
Forum-Anfänger
Beiträge: 17
Registriert: Mo 31. Aug 2015, 21:51

Nutzung von Variablen innerhalb eines Dokument

Beitrag von matze »

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?

Besserwisser

Beitrag von Besserwisser »

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.

matze
Forum-Anfänger
Forum-Anfänger
Beiträge: 17
Registriert: Mo 31. Aug 2015, 21:51

Beitrag von matze »

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?)?

Besserwisser

Beitrag von Besserwisser »

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.

Antworten