Einen text ZEILENWEISE farbig markieren

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


DerArbeitenschreiberling
Forum-Anfänger
Forum-Anfänger
Beiträge: 33
Registriert: Fr 31. Mär 2017, 18:28

Einen text ZEILENWEISE farbig markieren

Beitrag von DerArbeitenschreiberling »

Hallo!

Ich arbeite gerade an etwas, bei dem "Markierungen" im Text sehr nützlich wären, und zwar solche, die ich automatisch generieren kann. Gegeben sei also ein großer Absatz, und diesen möchte ich wie mit einem Textmarker markieren. An sich habe ich bereits ein Kommando, das diese Aufgabe erfüllt:
\documentclass{article}
\usepackage{xcolor}
\usepackage[ngerman]{babel}
\usepackage{blindtext}

\newcommand{\textmarked}[1]{\colorbox{yellow}{\parbox{\linewidth}{#1}}} % Zwinge den Text dazu, aufgrund einer \parbox bei Linienende umzubrechen und markiere das ganze gelb

\begin{document}
	\noindent
	\textmarked{\blindtext}
\end{document}
Allerdings stört es mich, dass nun natürlich die ganze Box gelb eingefärbt wird. Viel schöner fände ich es, wenn wirklich nur der Text eingefärbt werden würde, und der Freiraum unten rechts freibliebe. So wie ich es verstehe, geht das allerdings nur, indem man jede Zeile einzeln mit einer \colorbox behandelt. Das stellt mich wiederum vor ein Problem, da ich natürlich wissen müsste, wann genau ein Linebreak zustande gekommen ist, um darauf dann mit der colorbox reagieren zu können.

Vielleicht könnte man auch eine Umgebung erstellen, in der der Linebreak temporär umdefiniert wird? Das heißt, man speichert den normalen linebreak mittels \let, erneuert das Kommando und fügt nach dem Teil, der den Linebreak erzeugt, meine colourbox hinzu, und macht das ganze am Ende wieder rückgängig. Allerdings weiß ich nicht, welches Kommando LaTeX intern benutzt, um Zeilenumbrüche einzufügen. Außerdem könnte der Fakt, dass der Text der colourbox in {} stehen muss, zu einer herausforderung führen, da das Kommando für den Linebreak ja selbst keine Parameter nimmt, oder?

Hat jemand eine Idee wie man an dieses Problem herangehen könnte?
Zuletzt geändert von DerArbeitenschreiberling am So 12. Nov 2017, 15:56, insgesamt 1-mal geändert.

Benutzeravatar
Johannes_B
Moderator
Moderator
Beiträge: 5079
Registriert: Do 1. Nov 2012, 14:55
Kontaktdaten:

Beitrag von Johannes_B »

Google?
Spaß beiseite.
Du musst auf jeden Fall den Hyphenation Algorithmus umgehen, bzw. diesen aufbohren um die Boxen am Zeilenende nachträglich einzufärben. Ach Quatsch. Hast du einfach mal Google genutzt?
\documentclass[a5paper]{article}
\usepackage{xcolor}
\usepackage{soul}
\usepackage[ngerman]{babel}


\begin{document}
\large
   \noindent
   \hl{Hier steht ganz viel Text und Google hat mir geholfen mit textmarker LaTeX die L\"osung zu finden. Der LaTeX-Begleiter, Seite 95. War gar nicht schwer.}
\end{document}
https://books.google.de/books?id=jSSSyT2SAkgC&pg=PA95&lpg=PA95&dq=textmarker+latex&source=bl&ots=2vBI7uA5nz&sig=WCANgcSvPcJ_x_6vOz5uAJTTAo4&hl=de&sa=X&ved=0ahUKEwjxks3WgbbXAhWH16QKHTY7C20Q6AEIQjAD#v=onepage&q=textmarker%20latex&f=false
TeXwelt - Fragen und Antworten Schaut vorbei und stellt Fragen.
LaTeX-Vorlagen?

Der Weg zum Ziel: Ruhe bewahren und durchatmen, Beiträge und unterstützende Links aufmerksam lesen, Lösungsansätze verstehen und ggf. nachfragen.

Stamm-

Bereits Vorhandenes nutzen

Beitrag von Stamm- »

Dazu braucht man weder einen neuen Befehl noch ein zusätzliches Paket, weil 》xcolor《 mit \textcolor das notwendige Werkzeug bereits zur Verfügung stellt.
\documentclass[11pt,a4paper,ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage{selinput}
\SelectInputMappings{adieresis={ä},germandbls={ß}}
\usepackage{babel}
\usepackage[margin=2cm,includeheadfoot]{geometry}

\usepackage{xcolor}

\usepackage{blindtext}

\begin{document}
  \textcolor{yellow}{\blindtext}
\end{document}

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

Beitrag von iTob »

Es soll aber nicht der Text selbst farbige werden sondern eine farbige Hinterlegung gemacht werden ;-) und das geht eben nicht mit den Möglichkeiten von xcolor … dafür hat Johannes ja ne Antwort geliefert.
Ich biete Hilfe, Beratung und Schulung für alle Fragen rund um TeX, Buchgestaltung und Textsatz, sowie Grafik- und Kommunikationsdesign.
Mehr Infos und Kontakt unter tobiw.de.

Hier schreibe ich über TeX: Mein Blog „TeX-Beispiel des Monats“ (Deutsch) und TeX.tips (Englisch).

DerArbeitenschreiberling
Forum-Anfänger
Forum-Anfänger
Beiträge: 33
Registriert: Fr 31. Mär 2017, 18:28

Beitrag von DerArbeitenschreiberling »

Johannes_B hat geschrieben:
\documentclass[a5paper]{article}
\usepackage{xcolor}
\usepackage{soul}
\usepackage[ngerman]{babel}

\begin{document}
\large
   \noindent
   \hl{Hier steht ganz viel Text und Google hat mir geholfen mit textmarker LaTeX die L"osung zu finden. Der LaTeX-Begleiter, Seite 95. War gar nicht schwer.}
\end{document}
Super! Schön dass du was gefunden hast. Meine Suche war da leider nicht so erfolgreich; wahrscheinlich, weil ich "Google" meist meide.

Jedenfalls funktioniert deine Lösung an deinem Beispiel ganz gut, aber beim Blindtext hört es bereits auf. Laut Paketdokumentation wird es in dem Falle wohl an "grouped hyphenatable material" liegen.
Das wird auch in meinem Text zum Problem, da ich, um das zu umgehen, um jede Textstelle, auf die ich ein Kommando anwende, manuell eine \mbox ziehen müsste. Denn leider geht nicht: \hl{ \testcmd{\mbox{hyphenatable}} }, sondern nur \hl{ \mbox{\testcmd{hyphentable}} }. Ansonsten hagelt es fehlermeldungen. Es kompiliert zwar trotzdem noch ein akzeptables Dokument, aber gut sind Fehlermeldungen nie.

Was \hl außerdem nicht kann: Mit richtigen Umlauten umzugehen. Das ist schlecht, denn das ganze Wort verschwindet, wenn es einen Umlaut enthält. Wenn es noch mehr solcher Wörter sind, verschwindet manchmal sogar ein Großteil des Absatzes.
Man müsste hier also Abstriche machen, indem man jeden Umlaut mit "{arg} ersetzt. Das tue ich nur ungern.

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

Beitrag von iTob »

Wenn deine Dateien mit Unicode kodiert sind und du soulutf8 benutzt, sollte es gehen. Siehe auch https://tex.stackexchange.com/q/160220/4918
\documentclass[a5paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\usepackage{soulutf8}
\usepackage[ngerman]{babel}

\begin{document}
\large
   \noindent
   \hl{Hier steht ganz viel Text und Google hat mir geholfen mit textmarker LaTeX die Lösung zu finden. Der LaTeX-Begleiter, Seite 95. War gar nicht schwer.}
\end{document}
Dein Problem mit den Befehlen hab ich nicht wirklich verstanden, mach da mal nen konkretes Minimal-Beispiel zu, bitte.

Und nur weil du Google nicht magst, heißt das ja nicht, dass du das Internet nicht durchsuchen kannst, ehe du eine Frage stellst ;-) gibt ja noch mehr Suchmaschinen …
Ich biete Hilfe, Beratung und Schulung für alle Fragen rund um TeX, Buchgestaltung und Textsatz, sowie Grafik- und Kommunikationsdesign.
Mehr Infos und Kontakt unter tobiw.de.

Hier schreibe ich über TeX: Mein Blog „TeX-Beispiel des Monats“ (Deutsch) und TeX.tips (Englisch).

DerArbeitenschreiberling
Forum-Anfänger
Forum-Anfänger
Beiträge: 33
Registriert: Fr 31. Mär 2017, 18:28

Beitrag von DerArbeitenschreiberling »

@iTob

Danke! Das Paket soulutf8 funktioniert.

Was die Befehle angeht, versuche ich eben, das mit der \mbox etwas zu automatisieren. Ich will nicht an jede Textstelle die ein Kommando hat eine \mbox schreiben müssen, sondern das soll ein Kommando für mich machen. Das MWE hier sollte das hoffentlich gut zeigen. Am besten die Kommandos einzeln auskommentieren um zu sehen, wie sie sich verhalten.
\documentclass[a5paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\usepackage{soulutf8}
\usepackage[ngerman]{babel}


\newcommand{\thiswontwork}[1]{#1}

\newcommand{\thiswillwork}[1]{#1}

\newcommand{\thisalsowontwork}[1]{\mbox{#1}}

\begin{document}
\large
   \noindent
   \hl{
   		Hier steht \thiswontwork{ganz viel hyphenatable Text} %% Funktioniert nicht, weil jedes Kommando automatisch zu einer "Gruppierung" führt, und Text innerhalb einer Gruppierung nicht silbentrennbar sein darf %%
   		und
   		\mbox{\thiswillwork{Google hat mir geholfen}} %% Funktioniert, weil es in eine \mbox gesetzt wurde, ansonsten würde es nicht gehen. %%
   		mit textmarker LaTeX die Lösung zu finden. Der LaTeX-Begleiter, Seite 95.
  		\thisalsowontwork{War wirklich gar nicht schwer.} %% Funktioniert nicht, obwohl die \mbox{} doch eigentlich nicht silbentrennbar sein dürfte?
	}
\end{document}
Was die Suchmaschine angeht, wollte ich bloß ausdrücken, dass meine Suchmaschine eventuell weniger findet als Google. Bei mir bestanden die Ergebnisse zunächst nur aus "TexMaker", und als ich das herausgefiltert hatte waren es eher irrelevante Sachen wie Wörterbucheinträge oder Übersetzungen für das Wort "Textmarker". Das vermittelte mir schon mal den Eindruck, dass es keine offensichtliche Lösung für das Problem gäbe.

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

Beitrag von iTob »

Schau mal in die soul (ohne utf8) Doku in Abschnitt 5.2. Da wir erklärt, wie man eigene Befehle „registrieren“ kann, damit sie mit dem Paket funktionieren.

Suchmaschine: Hm … was nutzt du denn? Ich arbeite schon ein paar Jahre mit Duckduckgo und finde dort bisher alles was ich brauche und kann keinen Unterschied zu Google feststellen …
Ich biete Hilfe, Beratung und Schulung für alle Fragen rund um TeX, Buchgestaltung und Textsatz, sowie Grafik- und Kommunikationsdesign.
Mehr Infos und Kontakt unter tobiw.de.

Hier schreibe ich über TeX: Mein Blog „TeX-Beispiel des Monats“ (Deutsch) und TeX.tips (Englisch).

DerArbeitenschreiberling
Forum-Anfänger
Forum-Anfänger
Beiträge: 33
Registriert: Fr 31. Mär 2017, 18:28

Beitrag von DerArbeitenschreiberling »

Du hast recht, "Fontkommandos" lassen sich mit \soulregister{<cmd>}{<0/1>} kinderleicht registrieren. Das heißt, Kommandos die entweder 0 oder 1 Parameter entgegennehmen.

Leider ist das für mich ein Problem. Die Kommandos, die ich in meinem Dokument verwende, nehmen bis zu drei Parameter entgegen. Sehen wir uns das ganze einmal an:
\documentclass[a5paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\usepackage{soulutf8}
\usepackage[ngerman]{babel}


\newcommand{\multiarg}[3][OPTIONAL]{#2}
\soulregister{\multiarg}{1}

\begin{document}
	\large
	\noindent
	\hl{Hier steht ganz viel Text und \multiarg[DEFINED]{der}{TEST} wird jetzt markiert.}
\end{document}
Was passiert? Mein Kommando \multiarg, welches zunächst drei Parameter entgegennahm, wurde höchstwahrscheinlich von \soulregister umdefiniert, sodass es nur noch einen Parameter entgegennimmt. Das bedeutet, dass die anderen Parameter (DEFINED und TEST) um das Kommando herum einfach in den Text gedruckt werden und gar nicht zum Kommando \multiarg gelangen. Denn würden diese Parameter zu \multiarg gelangen, dann würde dieses Kommando sie ignorieren, da laut der Definition nur Parameter #2 verwendet wird. Außerdem wird der Text nach meinem Kommando nicht mehr markiert.

Gut, man wundert sich jetzt vielleicht warum ich überhaupt Kommandos habe, die bestimmte Parameter gar nicht verwenden.
Das liegt daran, dass ich mein Dokument schnell und einfach in mehreren Versionen kompilieren möchte. Bei einer dieser Versionen möchte ich einige Texte, wie hier erfragt, markieren; bei der anderen möchte ich ganz andere Kommandos ausführen, die z.B. Textstellen auf besondere Art und Weise markieren und dabei Marginalen drucken. Ich habe das zunächst so gelöst, indem ich diese Kommandos erst "scharf stellen" muss.
Das heißt, ich definiere sie zunächst so, dass sie zwar die drei Parameter entgegennehmen, aber nur einen Parameter -- denjenigen, der den Text darstellt, der formatiert werden soll -- ausgeben. Nach dem Kompilieren sieht es also erstmal so aus, als würde es diese Kommandos gar nicht geben. Erst mit einem weiteren Kommando, das diese "dummy commands" dann allesamt neu definiert, werden die Kommandos "scharf gestellt" sodass sie ihre Funktionalität erhalten.
Ich weiß, es wäre vielleicht besser, das ganze mit Booleans zu handhaben, allerdings empfinde ich diese Möglichkeit als genauso schnell und dazu noch etwas einfacher zu implementieren.


Jedenfalls bräuchte ich jetzt eine Möglichkeit, diese beiden anderen Parameter zu ignorieren. Da fielen mir zwei Möglichkeiten ein:
1.) Ein Kommando \onlyifdefined erstellen, das die Parameter nur übergibt, wenn auch dieses Kommando scharfgestellt wurde:
\documentclass[a5paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\usepackage{soulutf8}
\usepackage[ngerman]{babel}


\newcommand{\multiarg}[3][OPTIONAL]{#2}
\soulregister{\multiarg}{1}

\newcommand{\onlyifdefined}[1]{}

\newcommand{\define}{
	\renewcommand{\onlyifdefined}[1]{##1}
	}

%\define % Alle Parameter, die mit \onlyifdefined{} umschlossen sind, durchlassen. Ansonsten alle diese Parameter löschen.

\begin{document}
	\large
	\noindent
	\hl{Hier steht ganz viel Text und \multiarg[\onlyifdefined{DEFINED}]{der}{\onlyifdefined{TEST}} wird jetzt markiert.}
\end{document}
Das hat allerdings einige Probleme. Zum einen sind noch die eckigen Klammern des optionalen Arguments zu sehen (das Problem könnte ich lösen, indem ich meine Kommandos so umdefiniere, dass das optionale Argument verpflichtend wird). Zum anderen wird der Text nach meinem Kommando genau wie beim Beispiel oben nicht mehr markiert.

2.) Alle Parameter in ein einziges Argument schreiben, und das dann im Kommando irgendwie auftrennen. Ähnlich wie die Listen, die z.B. beim Laden eines Pakets übergeben werden.

Das wäre allerdings ziemlich kompliziert und wahrscheinlich auch sehr unleserlich. Wenn sich herausstellen sollte, dass dies die einzige Möglichkeit ist, dann würde ich wohl auf die Textmarkierungen verzichten müssen.



Und nochmal zur Suchmaschine: Ich benutze auch DuckDuckGo und bin damit sehr zufrieden, allerdings waren die Ergebnisse in diesem Falle schon recht unterschiedlich. Während mich bei Google bereits der 5. Link zu einer Seite führt, die mir geholfen hätte, ist es bei DDG erst der 11. Ohne bis dorthin zu scrollen hatte ich aber schon die Suche [textmarker latex -"texmaker"] gestartet, und da finde ich auf einmal gar keine relevanten Ergebnisse mehr. Ich verstehe nicht ganz, wie das filtern des literals "texmaker" dafür sorgen kann, dass z.B. dieser Link ebenfalls entfernt wird, aber ich werde wohl in Zukunft mehr darauf achten müssen.

Auch für den Fall, dass wir hier keine genaue Lösung finden sollten, bedanke ich mich aber schonmal für die ausführliche Hilfe. Ich denke, dass ich trotzdem einiges mit diesen Informationen anfangen kann.

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

Beitrag von iTob »

Verstehe … schau mal hier https://tex.stackexchange.com/q/139463/4918 ob das hilft. Du kannst auch generell nochmal auf TeX.SX stöbert, z.B. in dem du einen der Tags unterhalb der Frage anklickst.
Ich biete Hilfe, Beratung und Schulung für alle Fragen rund um TeX, Buchgestaltung und Textsatz, sowie Grafik- und Kommunikationsdesign.
Mehr Infos und Kontakt unter tobiw.de.

Hier schreibe ich über TeX: Mein Blog „TeX-Beispiel des Monats“ (Deutsch) und TeX.tips (Englisch).

Antworten