Einen text ZEILENWEISE farbig markieren

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Einen text ZEILENWEISE farbig markieren

von iTob » Mo 13. Nov 2017, 18:02

Also du könntest auf TeX.SX ja noch eine sog. Followup-Question zu der oben verlinkten Stellen. Ich wüsste jetzt auch die Schnelle auch keine andere Lösung, weil ich selber mit soul praktisch nie arbeite.

Grundsätzliche stellt sich mir aber schon die Frage, wozu du in einem Dokument diese Hervorhebungen brauchst. Also vielleicht gibt es da – auch aus gestalterischer Sicht – ja ne elegantere Lösung. Wie du ja auch schon angedeutet hast …

von DerArbeitenschreiberling » Mo 13. Nov 2017, 16:12

Die Sache mit den "geheimen" weiteren Optionen für \soulregister scheint leider nicht zu helfen. Während es bei den in jenem Beispiel angesprochenen Kommandos \ref und \cite klappt, gibt es bei meinem Kommando weiterhin Probleme.

Überraschenderweise kann man aber, laut dem Link, Kommandos einfach mit {} umschließen, und sie werden dann sogar ohne \soulregister ausgeführt. Allerdings führt das dann wieder zum Problem mit dem "grouped hyphenatable material", welches man natürlich umgehen müsste. Ein automatisches \mbox ist dabei keine Option, da damit der von den Kommandos zurückgegebene, teils recht lange Text schnell mal über den Rand hinausragt; eine \parbox würde uns ebenso zum Ausgangsproblem zurückführen.

Heißt also: Entweder die hyphenation jedes einzelnen Wortes lokal aufheben können (ohne manuell jene Worte mit \mbox zu umschließen), oder es einfach sein lassen. Das erstere Option wohl nur durch das definieren einer eigenen Sprache in Babel gelingt, habe ich habe mich jetzt für letzteres entschieden. In der Zwischenzeit habe ich in meinem Dokument an einer Alternative gearbeitet, die nicht so viele Probleme bereitet und dafür auch noch ganz passabel aussieht.
Vielen Dank nochmal für deine Hilfe; ich wünsche einen schönen Tag.

von iTob » So 12. Nov 2017, 18:55

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.

von DerArbeitenschreiberling » So 12. Nov 2017, 15:55

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.

von iTob » Sa 11. Nov 2017, 19:28

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 …

von DerArbeitenschreiberling » Sa 11. Nov 2017, 16:15

@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.

von iTob » Sa 11. Nov 2017, 15:46

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 …

von DerArbeitenschreiberling » Sa 11. Nov 2017, 15:32

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.

von iTob » Sa 11. Nov 2017, 14:27

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.

Bereits Vorhandenes nutzen

von Stamm- » Sa 11. Nov 2017, 13:58

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}

Nach oben