Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 17

Thema: Box über Text positionieren

  1. #1
    Registrierter Benutzer
    Registriert seit
    16.06.2012
    Beiträge
    19

    Box über Text positionieren

    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):
    Code:
    NormalText $\shortstack[c]{\fcolorbox{black}{white}{A1}\\ Text}$ Normaltext
    Code:
    Normaltext $\shortstack[c]{\fcolorbox{black}{white}{A1}\\
    	\begin{minipage}{0mm}
    		\vspace{10mm}
    	\end{minipage}
    }$ Normaltext
    Mit Stackrel hab ich's auch versucht:
    Code:
    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:
    Code:
    \overBox{BoxInhalt}
    Verwenden möchte ich es dann so:
    Code:
    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?

  2. #2
    Registrierter Benutzer
    Registriert seit
    21.08.2009
    Beiträge
    496
    Hallo,

    hier ist mal ein Vorschlag:
    Code:
    \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

  3. #3
    ctansearch
    Gast
    So kann es gehen:

    Code:
    \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.

  4. #4
    Registrierter Benutzer
    Registriert seit
    16.06.2012
    Beiträge
    19

    Abstand anpassen

    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:
    Code:
    \newcommand{\overbox}[1]{
    	\newlength{\wlen}
    	\settowidth{\wlen}{#1}
    	\raise.9\baselineskip\hbox{\textsl{\fcolorbox{black}{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?

  5. #5
    ctansearch
    Gast
    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.

  6. #6
    Registrierter Benutzer
    Registriert seit
    06.03.2010
    Ort
    St. Petersburg, Russland
    Beiträge
    2.468
    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?

  7. #7
    Registrierter Benutzer
    Registriert seit
    09.12.2005
    Beiträge
    1.327
    Zitat Zitat von moono Beitrag anzeigen
    Woher kommt dieser Abstand, bzw. was macht dein Befehl genau?
    Aus den unzähligen signifikanten Leerzeichen in Form von nicht maskierten Zeilenenden.

  8. #8
    Registrierter Benutzer
    Registriert seit
    16.06.2012
    Beiträge
    19

    Leerzeichen maskieren

    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?

  9. #9
    Registrierter Benutzer
    Registriert seit
    06.03.2010
    Ort
    St. Petersburg, Russland
    Beiträge
    2.468
    Auskommentieren mit %. Also an jedes Zeilenende im kritschen Bereich ein %-Zeichen. Hast du bestimmt schon irgendwo gesehen und dich gewundert, was die vielen % sollen :-)

  10. #10
    Registrierter Benutzer
    Registriert seit
    16.06.2012
    Beiträge
    19

    Leerzeichen auskommentieren

    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:
    Code:
    \newcommand{\overbox}[1]{
    	\newlength{\wlen}
    	\settowidth{\wlen}{#1}
    	\raise.9\baselineskip\hbox{\textsl{\fcolorbox{black}{white}{#1}}}\hspace{-\wlen}
    }

  11. #11
    Registrierter Benutzer
    Registriert seit
    06.03.2010
    Ort
    St. Petersburg, Russland
    Beiträge
    2.468
    Tabs am Anfang verursachen, so weit ich weiß, keine signifikangen Leerzeichen.

  12. #12
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    Zitat Zitat von moono Beitrag anzeigen
    Verwenden möchte ich es dann so:
    Code:
    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.
    Code:
    \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).

  13. #13
    Registrierter Benutzer
    Registriert seit
    17.08.2006
    Beiträge
    192
    Zitat Zitat von moono Beitrag anzeigen
    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 (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.

    VG

    Lilly

  14. #14
    Registrierter Benutzer
    Registriert seit
    06.03.2010
    Ort
    St. Petersburg, Russland
    Beiträge
    2.468
    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.

  15. #15
    ctansearch
    Gast
    @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.

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •