PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Box über Text positionieren



moono
28-10-2012, 21:35
Hallo Zusammen

Ich experimentiere seit längerem mit dem Positionieren von Boxen an einer bestimmten Stelle über einer Textzeile.

Als erstes habe ich es mit Shortstack versucht (Normaltext ist einfach der Text vor und hinter der Box in der Zeile, A1 der mit der Box hochgestellte Text):


NormalText $\shortstack[c]{\fcolorbox{black}{white}{A1}\\ Text}$ Normaltext



Normaltext $\shortstack[c]{\fcolorbox{black}{white}{A1}\\
\begin{minipage}{0mm}
\vspace{10mm}
\end{minipage}
}$ Normaltext

Mit Stackrel hab ich's auch versucht:


NormalText $\stackrel{\hbox{A1}}{\hbox{
\begin{minipage}{0mm}
\vspace{10mm}
\end{minipage}
}}$ NormalText

Die Probleme sind immer die gleichen: Ich muss den Text darunter angeben, ansonsten muss ich eine minipage als "Leerelement" verwenden. Und die Breite der Box hinterlässt in der Textzeile eine entsprechende Lücke.

Was ich eigentlich will ist folgendes: Mit Newcommand ein Kommando zusammenstellen, das in etwa so ist:

\overBox{BoxInhalt}

Verwenden möchte ich es dann so:


NormalText\overBox{A1} Normal\overBox{A2}Text NormalText\overBox{A3}

Die Box soll genau über der Stelle zentriert werden, an der der Befehl im Wort/in der Zeile steht. Die Zeile soll keine zusätzliche Lücke erhalten, d.h. dass sich die Box nicht auf die darunterliegende Zeile auswirkt.

Ich hab bereits Stunden gegoogelt, aber bis jetzt keine schlaue Lösung gefunden.
Hat mir jemand einen heissen Tipp?

esdd
30-10-2012, 21:15
Hallo,

hier ist mal ein Vorschlag:

\documentclass{scrartcl}

\newcommand\overBox[1]{\shortstack{\makebox[0pt][c]{\fbox{#1}}\\\vphantom{T}}}

\begin{document}
NormalText\overBox{A1} Normal\overBox{A2}Text NormalText\overBox{A3}
\end{document}
Gruß
Elke

ctansearch
30-10-2012, 22:19
So kann es gehen:



\documentclass{article}
\newcommand{\overbox}[2]{\raise.5\baselineskip\hbox{\textsl{#2}}\hspace{#1 }}
\begin{document}
Normaler Text Normaler Text Normaler Text Normaler Text Normaler Text Normaler
Text Normaler Text normaler
Text. Normaler Text Normaler Text Normaler Text Normaler Text Normaler Text
Normaler Text \overbox{-42pt}{overbox} Normaler Text Normaler Text Normaler Text Normaler Text Normaler
Text Normaler Text Normaler Text Normaler Text Normaler Text
\end{document}


Du musst jeweils als #1 die (negative)Länge angeben, um die Du den normalen Text unter die Box zurückziehen willst, da man ja im voraus nicht weiß, wie lang das overbox-Wort wird.

moono
30-10-2012, 23:00
Normaler Text \overbox{-42pt}{overbox} Normaler Text


Das kommt schon relativ nahe an das heran, was ich möchte.
Die Angabe der Wortlänge finde ich allerdings etwas unpraktisch, darum lese ich sie gleich aus:


\newcommand{\overbox}[1]{
\newlength{\wlen}
\settowidth{\wlen}{#1}
\raise.9\baselineskip\hbox{\textsl{\fcolorbox{blac k}{white}{#1}}}\hspace{-\wlen}
}

Normaler Text \overbox{A1} Normaler Text

Allerdings habe ich noch das Problem, dass der Abstand zwischen den normalen Wörtern immer noch überdimensional lang ist. Woher kommt dieser Abstand, bzw. was macht dein Befehl genau?

ctansearch
30-10-2012, 23:39
Hallo,
Die Längenbestimmung durch \setlength etc scheint erstmal ganz klug zu sein, funktioniert aber nur mit einzelnen Wörtern. Darüber hinaus muß man die Länge des Einzugs bzw negativen Einzugs ohnehin noch manuell angeben, indem man \hspace{-1.5\wlen} etc angibt. LaTeX macht aber manchmal sehr irre Dinge mit relativen Angaben.

Es ist meist schneller und effektiver, die Abstände in der kleinsten verfügbaren Einheit anzugeben und selbst anzupassen.

Mein Befehl hebt nur einfach den Box-Text an, positioniert diesen hinter den Befehl und schiebt den Lauftext darunter. Könnte man auch so machen, daß man die Textbox frei verschiebbar macht, aber dann gibt es Konflikte mit den Umbrüchen.

rstuby
31-10-2012, 06:11
Wieso soll \settowidth nur mit einzelnen Wörtern funktionieren? Die Länge von \versewidth aus dem Paket verse wird doch auch mit \settowidth gesetzt und das funktioniert gut mit ganzen Zeilen. Wird nicht normalerweise eher gesagt, man sollte möglichst relative Längen benutzen?

klops
31-10-2012, 09:18
Woher kommt dieser Abstand, bzw. was macht dein Befehl genau?Aus den unzähligen signifikanten Leerzeichen (http://www.komascript.de/signifikanteLeerzeichen) in Form von nicht maskierten Zeilenenden.

moono
31-10-2012, 15:26
Eine manuelle Längeneingabe ist aus folgenden Gründen nicht tragbar:

Der Benutzer, der \overtext verwendet bringt keine grossen Latex Kenntnisse mit
Die richtige Länge "auszuprobieren" ist dem Benutzer nicht zumutbar
Die Zeichenfolge, die mit \overtext hochgestellt werden soll, wird sich im Bereich von 1-4 Zeichen bewegen

Vielleicht noch eine Erklärung, was ich mit dem ganzen mache: es geht darum Akkorde für Gitarrenbegleitung über Gesangstext zu stellen.

Der Grund, dass ich nicht eine der unzähligen existierenden Libraries nutze: die einen funktionieren nicht, die Andern müssten postcompiled werden, die dritten sind ein Gebastel. Kurz und gut: dem endgültigen Benutzer nicht zumutbar.

Mein Ziel ist es, dass der Benutzer einfach seinen Liedtext schreiben kann und zwischen zwei Buchstaben mit \chord{F}, bzw. \chord{\es{A}} oder \chord{\is{G}}, \chord{\sus{D}}, etc. einen Akkord setzen kann, der darüber in einem Kästchen dargestellt wird. (\chord == \overscript)

Aus diesem Grund dürfen auch nicht zusätzliche Leerzeichen eingefügt werden, damit ein Wort nicht getrennt wird, wenn ein Akkord in der Mitte gesetzt wird.



Aus den unzähligen signifikanten Leerzeichen in Form von nicht maskierten Zeilenenden.
Auf die Schnelle habe ich im Netz nicht herausgefunden, wie ich Leerzeichen, Tabs und Umbrüche maskieren kann. Wie geht das?

rstuby
31-10-2012, 15:33
Auskommentieren mit %. Also an jedes Zeilenende im kritschen Bereich ein %-Zeichen. Hast du bestimmt schon irgendwo gesehen und dich gewundert, was die vielen % sollen :-)

moono
31-10-2012, 15:43
Auskommentieren mit %. Also an jedes Zeilenende im kritschen Bereich ein %-Zeichen. Hast du bestimmt schon irgendwo gesehen und dich gewundert, was die vielen % sollen :-)
Genau. Ich hab gedacht, da habe jemand Zeilenkommentare vorbereitet ;-).

Und wie gehe ich bei Tabs vor? Hier habe ich ja z.B: bei Zeilen 2-4 Tabs am Anfang:


\newcommand{\overbox}[1]{
\newlength{\wlen}
\settowidth{\wlen}{#1}
\raise.9\baselineskip\hbox{\textsl{\fcolorbox{blac k}{white}{#1}}}\hspace{-\wlen}
}

rstuby
31-10-2012, 15:52
Tabs am Anfang verursachen, so weit ich weiß, keine signifikangen Leerzeichen.

u_fischer
31-10-2012, 16:11
Verwenden möchte ich es dann so:


NormalText\overBox{A1} Normal\overBox{A2}Text NormalText\overBox{A3}

Die Box soll genau über der Stelle zentriert werden, an der der Befehl im Wort/in der Zeile steht. Die Zeile soll keine zusätzliche Lücke erhalten, d.h. dass sich die Box nicht auf die darunterliegende Zeile auswirkt.



\documentclass[]{article}

\newcommand\overBox[1]{\raisebox{\ht\strutbox}[0pt][0pt]{\makebox[0pt]{\fbox{#1}}}}
\begin{document}

NormalText\overBox{A1} Normal\overBox{A2}Text NormalText\overBox{A3}
\end{document}


(\fbox kannst du natürlich auch wieder rausnehmen).

Lilliane
31-10-2012, 16:26
Der Grund, dass ich nicht eine der unzähligen existierenden Libraries nutze: die einen funktionieren nicht, die Andern müssten postcompiled werden, die dritten sind ein Gebastel. Kurz und gut: dem endgültigen Benutzer nicht zumutbar.

Falls Du noch einen Blick in ein anderes Programm werfen willst: Lilypond (http://lilypond.org/index.de.html) (Freie Software) ist entstanden, weil sich Musikmenschen über den schluderigen Notensatz geärgert haben. Mit Lilypond kannst Du alle Arten von Noten ähnlich wie in LaTeX schreiben und dann in ein pdf setzen lassen. Ein Beispiel für Gitarrenakkorde mit Bezeichnungen und Griffbildern findest Du in der LilyPond-Dokumentation (http://lilypond.org/doc/v2.16/Documentation/notation/guitar#indicating-power-chords).

VG

Lilly

rstuby
31-10-2012, 16:33
Oh, ich habe erst jetzt durch Lilianes Kommentar gelesen, wofür du die Boxen brauchst. Hast du schon mal \usepackage{musixguit} angesehen? Das hat bei mir auf Anhieb funktioniert. Allerdings nur zum Schreiben von Akkorden über Text. Für Akkorde über Noten habe ich mir selbst ein paar bequeme Zusatzbefehle definiert, die aber nur mit musixtex funktionieren.

ctansearch
31-10-2012, 22:14
@rstuby
Natürlich soll man,wo es geht, relative Größen benutzen, aber dazu braucht man eine Basis, auf die man sich beziehen kann, und die gibt es in diesem Fall wegen der vielen unkalkulierbaren signifikanten Leerzeichen nicht , wie klops schon sagte.

Ansonsten, nachdem man nun weiß, zu was die overbox dienen soll, stimme ich Dir zu.

moono
25-11-2012, 17:47
Ich habe noch etwas daran herumgefeilt. Jetzt schwebt die Box perfekt über der entsprechenden Stelle:


\newcommand\overbox[1]{\raisebox{5mm}[0pt][0pt]{\makebox[0pt]{\textbf{#1}}}}

Danke für euere Hilfe.

klops
27-11-2012, 10:04
Auf die Schnelle habe ich im Netz nicht herausgefunden, wie ich Leerzeichen, Tabs und Umbrüche maskieren kann. Wie geht das?
Das ist unter dem Link, den ich Dir gegeben habe, aber sogar an Hand eines Beispiels erklärt.


Tabs am Anfang verursachen, so weit ich weiß, keine signifikangen Leerzeichen.

Auch Leerzeichen am Zeilenanfang spielen in der Standardeinstellung keine Rolle:

\documentclass{article}

\begin{document}
Das%
ist%
ein%
Beispiel.
\end{document}