Variale als Array deklarieren

Fragen und Probleme, die nicht den obigen Kategorien zugeordnet werden können


Crys
Forum-Century
Forum-Century
Beiträge: 202
Registriert: So 16. Okt 2011, 20:34
Wohnort: localhost:1337

Variale als Array deklarieren

Beitrag von Crys »

Ich fange mit einem Beispiel an:
Ich habe einen Text, den ich öfters verwenden muss. Und zwar in verschiedenen Projekt an der selben Stelle, aber als anderer Text.
\newcommand{\meintext}{Hier steht ein längerer Text, den ich oft im Projekt einfügen müss}
Der Text ist aber so lang, dass ich den manchmal in mehrere Zeilen aufteilen muss. Aber an anderen Stellen in einem Stück einfügen will. Wenn ich den Text in mehrere Zeilen aufteile, dann ist es meist eine unterschiedliche Zeilenanzahl.
\newcommand{\meintextEins}{Hier steht ein längerer Text,}
\newcommand{\meintextZwei}{den ich oft im Projekt einfügen müss}

Hier mal ganz eingefügt:
\meintextEins~\meintextZwei

Hier in zwei Zeilen:
\meintextEins\\\meintextZwei
Wie oben dargestellt ist es sehr unpraktisch! Weil ich weiß ja nicht wie viele Teile ich habe.
Wieso kann ich eig keine Zahlen in Variablen verwenden?
\newcommand{\meintext}[1]{Hier steht ein längerer Text,}
\newcommand{\meintext}[2]{den ich oft im Projekt einfügen müss}

Hier mal ganz eingefügt:
\meintext

Hier in zwei Zeilen:
\meintext[1]\\\meintext[2]
Ich weiß das oben genannte geht nicht, aber versthet ihr was ich meine?
Wenn ich die Variable ohne Parameter ausgeben lasse, soll der ganze Text ausgegeben werden. Wenn ich die Variable mit Parameter ausgebe, dann soll nur der jeweilige Teil ausgegeben werden.

Wie kann ich da realisieren?

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Hallo,

ganz genau verstanden habe ich nicht, was du möchtest. Aber vielleicht hilft dir das Paket datatool:
\documentclass[parskip=half-]{scrartcl}

\usepackage{selinput}
\SelectInputMappings{adieresis={ä},germandbls={ß},Euro={€}}
\usepackage[ngerman]{babel}
\usepackage{microtype}

\usepackage{pgffor}
\usepackage{datatool}
\DTLnewdb{MeinText}
  \foreach \teiltext in {
    {Hier steht ein längerer Text,},
    {den ich oft im Projekt einfügen muss},
    {und nicht immer wieder schreiben möchte.}
  }{%
    \dtlexpandnewvalue
    \DTLnewrow{MeinText}
    \DTLnewdbentry{MeinText}{Inhalt}{\teiltext}
}

\makeatletter
\newcommand\meintext{\DTLforeach{MeinText}{\Inhalt@MeinText=Inhalt}{\Inhalt@MeinText\DTLiflastrow{}{ }}}
\newcommand\meinetextzeilen{\DTLforeach{MeinText}{\Inhalt@MeinText=Inhalt}{\Inhalt@MeinText\DTLiflastrow{}{\\}}}
\makeatother

\begin{document}

\meintext

\meinetextzeilen

\end{document}
Gruß
Elke

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4300
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

Wenn du den Text immer an den gleichen Stellen optional trennen willst, würde ich ja einfach ein optionales Argument nutzen:
\documentclass[parskip=half-]{scrartcl}
\newcommand{\meintext}[1][]{Hier steht ein längerer Text,#1 den ich oft im Projekt einfügen müss}

\begin{document} 
\meintext

\meintext[\\]

\end{document}

Noch so einer

Beitrag von Noch so einer »

Wenn Du die Breite der Ausgabe beschränkst, dann wird der Text automatisch entsprechend umbrochen:
\documentclass{article}
\usepackage{selinput}
\SelectInputMappings{
  adieresis={ä},
  germandbls={ß},
}
\usepackage{ragged2e}% für das Beispiel mit \RaggedRight
\newcommand*{\meintext}{Hier steht ein etwas längerer Text, den ich in diesem
  Projekt oft einfügen muss.}
\usepackage{parskip}% Nur aus Demo-Gründen

\begin{document}

\meintext

\parbox[tt]{.35\textwidth}{\strut\meintext\strut\par}

\parbox[tt]{.35\textwidth}{\raggedright\strut\meintext\strut\par}

\parbox[tt]{.35\textwidth}{\RaggedRight\strut\meintext\strut\par}

\end{document}
Für komplexere Szenarien sei auf das Paket xstring hingewiesen, das u. a. Strings zerteilen kann.

Crys
Forum-Century
Forum-Century
Beiträge: 202
Registriert: So 16. Okt 2011, 20:34
Wohnort: localhost:1337

Beitrag von Crys »

Danke euch!

Die Lösung von u_fischer ist die einfachste und genauso möchte ich es haben.
esdd, deins geht auch, nur ist ein klein bisschen komplexer ;)
Mit der Lösung vom Gast kann ich nichts anfangen, da ich keine feste Breite habe und an bestimmten Stellen im Text umbrechen möchte.

Crys
Forum-Century
Forum-Century
Beiträge: 202
Registriert: So 16. Okt 2011, 20:34
Wohnort: localhost:1337

Beitrag von Crys »

Wieso funktioniert das nicht:
\documentclass[parskip=half]{scrartcl}

\usepackage{selinput}
\SelectInputMappings{adieresis={ä},germandbls={ß},Euro={€}}
\usepackage[ngerman]{babel}

\newcommand{\meintext}[1][]{Hier steht ein längerer#1 Text, den ich oft im #1Projekt einfügen muss.}

\usepackage[
	pdftitle={\meintext}
]{hyperref}

\begin{document}

\meintext[\\]

\meintext

\end{document}
Den "pdftitle" kann ich nicht mit meiner Variable füttern.

Wenn ich die Variable so baue, wie in esdd's Beispiel, geht es auch nicht.

Genmutant
Forum-Guru
Forum-Guru
Beiträge: 488
Registriert: Di 8. Jul 2008, 11:00
Wohnort: Augsburg

Beitrag von Genmutant »

Es gibt da anscheinend ein Problem mit dem optionalen Parameter. Wenn er stattdessen nicht optional ist, geht es.
Geht nicht:
\documentclass[parskip=half]{scrartcl} 

\usepackage{selinput} 
\SelectInputMappings{adieresis={ä},germandbls={ß},Euro={€}} 
\usepackage[ngerman]{babel} 

\newcommand{\meintext}[1][]{b#1b}

\usepackage{hyperref}
\hypersetup{pdftitle={\meintext[a]}}

\begin{document}
\meintext[c]
\end{document}
Geht:
\documentclass[parskip=half]{scrartcl} 

\usepackage{selinput} 
\SelectInputMappings{adieresis={ä},germandbls={ß},Euro={€}} 
\usepackage[ngerman]{babel} 

\newcommand{\meintext}[1]{b#1b}

\usepackage{hyperref}
\hypersetup{pdftitle={\meintext{a}}}

\begin{document}
\meintext{c}
\end{document}
Du darfst den Titel übrigens erst im hypersetup setzen, nicht schon vorher (sagt die Anleitung).

Crys
Forum-Century
Forum-Century
Beiträge: 202
Registriert: So 16. Okt 2011, 20:34
Wohnort: localhost:1337

Beitrag von Crys »

¡Muchas gracias!
Das ist es Genmutant!

Genmutant
Forum-Guru
Forum-Guru
Beiträge: 488
Registriert: Di 8. Jul 2008, 11:00
Wohnort: Augsburg

Beitrag von Genmutant »

Es gibt sicher auch eine schöne, einfache Lösung für das optionale Parameter, aber ich hab auf die schnelle keine gefunden. Da dürften die erfahreren User aber was kennen vermute ich.

Benutzeravatar
cgnieder
Forum-Meister
Forum-Meister
Beiträge: 730
Registriert: Fr 22. Okt 2010, 18:37
Wohnort: Herrenberg
Kontaktdaten:

Beitrag von cgnieder »

Genmutant hat geschrieben:Es gibt da anscheinend ein Problem mit dem optionalen Parameter. Wenn er stattdessen nicht optional ist, geht es.
Befehle mit optionalem Argument sind i.d.R. nicht expandierbar (in einem Expansionskontext), da sie vorausschauen müssen, ob eine eckige Klammer folgt. In einem solchen Fall entfernt hyperref den Befehl und lässt einen Hinweis im log:
Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref)                removing `\meintext' on input line 10.
Definiert man es mit verpflichtendem Argument, dann ist es expandibel (solange die Definition nichts Unexpandierbares enthält).

\documentclass{scrartcl}
\newcommand{\meintext}[1]{b#1b}
\usepackage{hyperref}
\hypersetup{pdftitle={\meintext{\\}}}
\begin{document}
\meintext{c}
\end{document}
liefert folgerichtig:
Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref)                removing `\\' on input line 4.
Der PDF-Titel ist hier »bb«

Grüße
Clemens
Paketauthor

Antworten