Beispiel xkeyval aus DTK 3/2011

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


Klaus
Forum-Century
Forum-Century
Beiträge: 184
Registriert: Do 27. Jan 2011, 19:30

Beispiel xkeyval aus DTK 3/2011

Beitrag von Klaus »

Hi,

ich habe mir das Beispiel zu Textboxen mit Hilfe des xkeyval Pakets (aus der texnischen Komödie 3/2011) zu Gemüte geführt.

Momentan sieht mein Code so aus:
\documentclass[a4paper,fontsize=11pt]{scrartcl}
% Packages
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{color}
\usepackage{xkeyval}
% new Commands
\newcommand*\TextColor{black}
\newcommand*\BackgroundColor{white}
\newcommand*\BorderColor{black}
\makeatletter
\define@choicekey{TextAlignment}{align}[\val\al]{right,left,center,block}{%
	\ifcase\al\relax \raggedleft%
		\or\raggedright%
		\or\centering%
		\or% Blocksatz
	\fi}	
\define@key{TextBox}{textcolor}{\renewcommand*\TextColor{#1}}
\define@key{TextBox}{background}{\renewcommand*\BackgroundColor{#1}}
\define@key{TextBox}{bordercolor}{\renewcommand*\BorderColor{#1}}
\define@key{TextBox}{border}{\setlength\fboxrule{#1}}
\define@key{TextBox}{bordersep}{\setlength\fboxsep{#1}}
\presetkeys{TextBox}{bordercolor=black,textcolor=black,background=white,%
border=0.8pt,bordersep=3pt}{}%
\presetkeys{TextAlignment}{align=block}{}%
\makeatother
\newcommand\framedtext[2][]{%
\begingroup%
\setkeys*{TextBox}{#1}%
\fcolorbox{\BorderColor}{\BackgroundColor}{%
\begin{minipage}{\linewidth-2\fboxsep-2\fboxrule}%
\setrmkeys{TextAlignment}%
\textcolor{\TextColor}{#2}%
\end{minipage}}%
\endgroup}%
\begin{document}
\framedtext[align=center]{%
Hello World!%
}
\end{document}
Wenn ich kompiliere, dann bekomme ich eine Box, in der Hello World zentriert ist, allerdings am linken Rand noch ein -2-2 steht. :shock:

Kommt das von der Definition der Minipage? Schließlich verwende ich dort zwei Mal -2. Aber ich kann mir nicht erklären was da passiert.

Gruß,
Klaus.
Bei LaTex führen mir manchmal einfach zu viele Wege nach Rom.

Benutzeravatar
bloodworks
Moderator
Moderator
Beiträge: 1425
Registriert: Mo 19. Jan 2009, 10:52
Wohnort: /dev/null

Beitrag von bloodworks »

Füge noch ein
\usepackage{calc}
hinzu. Ich habe jetzt die DTK nicht zur Hand (was natürlich für eine pdf-Version sprechen würde, vll gehe ich doch nach Leipzig), deshalb kann ich dir nicht sagen, wie das im Beispiel gelöst wurde.

Ich finde das Beispiel so im Übrigen nicht so gut. Ohne \noindent vor dem Befehl ragt die Box über den Satzspiegel hinaus.
\usepackage{showframe}
zeigt das ganz gut.
[1] Nützliche Webdokumente für Anfänger und Fortgeschrittene
[2]Minimalbeispiel | [3]FAQ
[4]Regelwerk | [5] Knigge
Wenn nicht anderst angegeben ist mein System: texlive 2012, pdflatex, x86-64, Snow Leopard utd.
Angehöriger der Liga zur Verwendung von texdoc
texdoc mathmode koma l2picfaq l2tabu lshort-en
Achtung: Aufforderungen ein Minimalbeispiel oder mehr Erklärungen zu einer Frage zu liefern sind keine persönlichen Angriffe. Sie dienen viel mehr dazu die Kommunikation zwischen Fragendem und potentiellen Helfern zu erleichtern und zu präzisieren.


Klaus
Forum-Century
Forum-Century
Beiträge: 184
Registriert: Do 27. Jan 2011, 19:30

Beitrag von Klaus »

bloodworks hat geschrieben:Füge noch ein
\usepackage{calc}
hinzu.
Cool, das hat funktioniert! :shock: [1]

Warum?

bloodworks hat geschrieben: Ich finde das Beispiel so im Übrigen nicht so gut. Ohne \noindent vor dem Befehl ragt die Box über den Satzspiegel hinaus.
\usepackage{showframe}
zeigt das ganz gut.
Ich gestehe, dass ich das Beispiel dahingehend verändert habe, dass der Author seine documentclass mit der Option
parskip=half-
definiert hat. Das sollte die Box doch auch zum Positiven verändern, oder?

Gruß,
Klaus.

[1] Nun, dieser Kommentar rennt gerade bei mir offene Türen ein. So sehr wir LaTex Neulinge darauf getrimmt werden kompilierfähige Minimalbeispiele zu liefern, so fehlte erstmal die Angabe, dass 'xkeyval' und 'color' als Paket geladen werden sollen. Und jetzt scheinbar noch zusätzlich 'calc'? Das hat mich ein wenig geärgert. ;)
Bei LaTex führen mir manchmal einfach zu viele Wege nach Rom.

Benutzeravatar
bloodworks
Moderator
Moderator
Beiträge: 1425
Registriert: Mo 19. Jan 2009, 10:52
Wohnort: /dev/null

Beitrag von bloodworks »

Klaus hat geschrieben:
Ich gestehe, dass ich das Beispiel dahingehend verändert habe, dass der Author seine documentclass mit der Option
parskip=half-
definiert hat. Das sollte die Box doch auch zum Positiven verändern, oder?
Ja bei dieser Option wird der parindet auf 0 gesetzt. Damit gibts es keinen Absatzeinzug. Das ist ein bisschen ein Trick, damit muss der Autor sich nicht um den Einzug kümmern muss.
Klaus hat geschrieben: [1] Nun, dieser Kommentar rennt gerade bei mir offene Türen ein. So sehr wir LaTex Neulinge darauf getrimmt werden kompilierfähige Minimalbeispiele zu liefern, so fehlte erstmal die Angabe, dass 'xkeyval' und 'color' als Paket geladen werden sollen. Und jetzt scheinbar noch zusätzlich 'calc'? Das hat mich ein wenig geärgert. ;)
Nun ja ich spreche mich sehr dafür aus, auch in der DTK komplette lauffähige Beispiele zu machen. Wenn du möchtest, kannst du das ja mal verifizieren (also ich für meinen Teil würde den Fehler erst mal bei mir vermuten) und dann den Autor darauf ansprechen. Entweder direkt oder in der dante mailing liste.

Grüße
[1] Nützliche Webdokumente für Anfänger und Fortgeschrittene
[2]Minimalbeispiel | [3]FAQ
[4]Regelwerk | [5] Knigge
Wenn nicht anderst angegeben ist mein System: texlive 2012, pdflatex, x86-64, Snow Leopard utd.
Angehöriger der Liga zur Verwendung von texdoc
texdoc mathmode koma l2picfaq l2tabu lshort-en
Achtung: Aufforderungen ein Minimalbeispiel oder mehr Erklärungen zu einer Frage zu liefern sind keine persönlichen Angriffe. Sie dienen viel mehr dazu die Kommunikation zwischen Fragendem und potentiellen Helfern zu erleichtern und zu präzisieren.


Klaus
Forum-Century
Forum-Century
Beiträge: 184
Registriert: Do 27. Jan 2011, 19:30

Beitrag von Klaus »

Ich habe dazu nochmal eine Rückfrage.
Ich habe das obige Minimalbeispiel leicht modifiziert mit einem Satz vor und nach der Box:
\documentclass[a4paper,fontsize=11pt,ngerman]{scrartcl}
% Packages
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\usepackage{xkeyval}
\usepackage{calc}
% new Commands
\newcommand*\TextColor{black}
\newcommand*\BackgroundColor{white}
\newcommand*\BorderColor{black}
\makeatletter
\define@choicekey{TextAlignment}{align}[\val\al]{right,left,center,block}{%
   \ifcase\al\relax \raggedleft%
      \or\raggedright%
      \or\centering%
      \or% Blocksatz
   \fi}  
\define@key{TextBox}{textcolor}{\renewcommand*\TextColor{#1}}
\define@key{TextBox}{background}{\renewcommand*\BackgroundColor{#1}}
\define@key{TextBox}{bordercolor}{\renewcommand*\BorderColor{#1}}
\define@key{TextBox}{border}{\setlength\fboxrule{#1}}
\define@key{TextBox}{bordersep}{\setlength\fboxsep{#1}}
\presetkeys{TextBox}{bordercolor=black,textcolor=black,background=white,%
border=0.8pt,bordersep=3pt}{}%
\presetkeys{TextAlignment}{align=block}{}%
\makeatother
\newcommand\framedtext[2][]{%
\begingroup%
\setkeys*{TextBox}{#1}%
\fcolorbox{\BorderColor}{\BackgroundColor}{%
\begin{minipage}{\linewidth-2\fboxsep-2\fboxrule}%
\setrmkeys{TextAlignment}%
\textcolor{\TextColor}{#2}%
\end{minipage}}%
\endgroup}%
\begin{document}
Hier steht davor Text.
\framedtext[align=center]{%
Hello World!%
}
Und hier danach
\end{document}
Was mich jetzt wundert, dass die Box diret in der gleichen Zeile begonnen wird, wo der erste Satz aufhört.
Also scheinbar impliziert die minipage-Umgebung keinen automatischen Zeilenumbruch, wie ich es z.B. von Mathematikumgebungen (displaymath, equation, usw.) gewohnt bin?

Wie kann ich das denn zusätzlich einbauen?

Muss ich dann in der Definition der fcolorbox noch ein linebreak (oder ein vspace{} ) vor und nach der Minipageumgebung einbauen, z.B. so:
\fcolorbox{\BorderColor}{\BackgroundColor}{%
\linebreak
\begin{minipage}{\linewidth-2\fboxsep-2\fboxrule}%
\setrmkeys{TextAlignment}%
\textcolor{\TextColor}{#2}%
\end{minipage}%
\linebreak}%
Gruß,
Klaus.
Bei LaTex führen mir manchmal einfach zu viele Wege nach Rom.

Benutzeravatar
iTob
Forum-Meister
Forum-Meister
Beiträge: 1221
Registriert: Mo 19. Apr 2010, 22:19
Kontaktdaten:

Beitrag von iTob »

Da du ja nicht nur einen Zeilenumbuch sondern einen neuen Absatz willst, würde ich \par benutzen. Um die zusätzlichen Abstnde einzufügen empfielt sich \addvspace statt \vspace, weil ersteres den Leerraum nicht vergrößert, wenn bereit einer eingefügt wurde.
Um nach einer ggf. in einen (inhaltlichen) Absatz integrierten Minipage keinen Einzug zu bekommen, kannst du \noindent\ignorespacesafterend einfügen:

Hier nun der Code
\documentclass{scrartcl}

\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}

\makeatletter
\newenvironment{env}{%
	\par\addvspace{2\baselineskip}%
	\hspace*{2em}%
	\begin{minipage}{0.5\textwidth}%
}{%
	\end{minipage}%
	\par\addvspace{2\baselineskip}%
	\noindent\ignorespacesafterend%
}
\makeatother

\begin{document}
Das ein inhaltlicher Absatz davor (Fülltext Fülltext Fülltext Fülltext Fülltext
Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext
Fülltext Fülltext Fülltext Fülltext),
\begin{env}
--- Das ist die Minipage ---
\end{env}
der danach weitergeht (Fülltext Fülltext Fülltext Fülltext Fülltext
Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext
Fülltext Fülltext Fülltext Fülltext).

Neuer Absatz (Fülltext Fülltext Fülltext Fülltext Fülltext
Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext
Fülltext Fülltext Fülltext Fülltext) \dots
\begin{env}
--- Noch eine Minipage ---
\end{env}

Dieses mal beginnt danach aber ein neuer inhaltlicher Absatz (Fülltext
Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext Fülltext
Fülltext Fülltext Fülltext Fülltext)

\begin{env}
--- Folgen zwei aufeinander, ---
\end{env}
\begin{env}
--- wird trotzdem nur einfacher Abstand eingefügt ---
\end{env}
\end{document}
Anmerkung: Das was ich zu \addvspace gesagt habe stimmt, wird hier aber blöderweise ausgehebelt. Ich muss mal schauen, ob ich da noch eine bessere Lösung finde.

PS: Der Status Rückfrage ist anders gedacht ;-)

Klaus
Forum-Century
Forum-Century
Beiträge: 184
Registriert: Do 27. Jan 2011, 19:30

Beitrag von Klaus »

Heißen Dank!

Damit muss ich gleich mal rumspielen und ausprobieren! :)
iTob hat geschrieben: PS: Der Status Rückfrage ist anders gedacht ;-)
Äh, wie dann?

Gruß,
Klaus.
Bei LaTex führen mir manchmal einfach zu viele Wege nach Rom.

Benutzeravatar
Sepp99
Forum-Meister
Forum-Meister
Beiträge: 1569
Registriert: So 29. Aug 2010, 17:26
Wohnort: Offenhausen/OÖ

Beitrag von Sepp99 »

Klaus hat geschrieben:
iTob hat geschrieben: PS: Der Status Rückfrage ist anders gedacht ;-)
Äh, wie dann?
Siehe http://www.golatex.de/themen-mit-status ... t1872.html

Gruß, Sepp.-

Benutzeravatar
iTob
Forum-Meister
Forum-Meister
Beiträge: 1221
Registriert: Mo 19. Apr 2010, 22:19
Kontaktdaten:

Beitrag von iTob »

Hab’ die Lösung. Folgende Definition führt zum Ziel:
\makeatletter
\newenvironment{env}{%
	\par\addvspace{\baselineskip}%
	\hspace*{2em}%
	\begin{minipage}{0.5\textwidth}%
}{%
	\end{minipage}%
	\par\addvspace{\baselineskip}%
	\@endpetrue%
}
\makeatother
Habe auf TeX.SX gefragt und dort wusste es natürlich jemand :-)

Klaus
Forum-Century
Forum-Century
Beiträge: 184
Registriert: Do 27. Jan 2011, 19:30

Beitrag von Klaus »

Hi,
Alles klar! :)
iTob hat geschrieben: Hab’ die Lösung. Folgende Definition führt zum Ziel:
\makeatletter
\newenvironment{env}{%
	\par\addvspace{\baselineskip}%
	\hspace*{2em}%
	\begin{minipage}{0.5\textwidth}%
}{%
	\end{minipage}%
	\par\addvspace{\baselineskip}%
	\@endpetrue%
}
\makeatother
Habe auf TeX.SX gefragt und dort wusste es natürlich jemand :-)
Heißen Dank! Du bist der Beste. :)

Viele Grüße,
Klaus.
Bei LaTex führen mir manchmal einfach zu viele Wege nach Rom.

Antworten