Wie kann ich die Loop bzw das Macro (s.u.) so ändern, dass auch \textbackslash etc verwendet werden können?

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


knbg
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: Di 24. Mär 2020, 21:23

Wie kann ich die Loop bzw das Macro (s.u.) so ändern, dass auch \textbackslash etc verwendet werden können?

Beitrag von knbg »

ZZ beschäftigt mich das Problem, wie Code-Schnipsel (oder Pfade etc) in \texttt{...} getrennt werden können. Eine Trennung an beliebiger Stelle wäre ok.

Folgendes habe ich hier hier gefunden:

\documentclass{article}
\usepackage{hyphenat}
\usepackage{url}
\usepackage{xstring}
\usepackage{forloop}
\usepackage{xcolor}
%\usepackage{filecontents}

\newsavebox\MyArrowBox%
\sbox\MyArrowBox{$\hookleftarrow$}%
\makeatletter%
\newcommand*{\BreakableChar}{%
  \leavevmode%
  \prw@zbreak%
  \discretionary{\usebox\MyArrowBox}{}{}%
  \prw@zbreak%
}%

\newcounter{index}%
\newcommand{\AddBreakableChars}[1]{%
  \StrLen{#1 }[\stringLength]%
  \forloop[1]{index}{1}{\value{index}<\stringLength}{%
    \StrChar{#1}{\value{index}}[\currentLetter]%
    {\currentLetter\BreakableChar}%
  }%
}%

\newcommand*{\MyUrl}{https://tex.stackexchange.com/questions/28835/option-to-break-urls-with-carriage-return-symbol}%

\begin{document}
\parbox{4cm}{\textcolor{blue}{\AddBreakableChars{\MyUrl}}}

\bigskip
\parbox{7cm}{\textcolor{blue}{\AddBreakableChars{\MyUrl}}}
\end{document}

Das funktioniert durchaus und sieht gut aus. Nun wollte ich mir daraus ein neues texttt erstellen, also insbesondere sollte der Text zB auch \textbackslash und den Backtick, dh\textasciigrave aus dem textcomp Paket, (und Spaces) enthalten können. Wenn ich aber zB sowas mache:

\AddBreakableChars{Foo\textbackslash{}Bar}

dann erfolgt ein Abbruch mit Fehlermeldung. Es gibt auch einen Kommentar auf der verlinkten Seiten, dass man in \AddBreakableChars über Tokens statt über Zeichen iterieren müsse, aber leider steht keine Lösung dabei.

Da ich von LaTeX-Makroprogrammmierung nicht viel verstehe, wollte ich nachfragen, ob mir hier jemand helfen kann.
Der Thread auf tex.stackexchange ist über 8 Jahre alt, es scheint mir daher nicht sinnvoll, dort nachzufragen.

Ich habe Alternativlösungen gefunden, die auf url basieren, aber die verschlucken immer die Spaces, außerdem wird der Backtick nicht korrekt dargestellt.

Mein LaTeX-Code wird übrigens per Pandoc aus Markdown generiert, sodass man evt auch was mit pandoc-Filtern machen könnte, aber eine LaTeX-Lösung wäre mir lieber.


Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4266
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Re: Wie kann ich die Loop bzw das Macro (s.u.) so ändern, dass auch \textbackslash etc verwendet werden können?

Beitrag von u_fischer »

sowas könnte gehen (in texlive 2020, in älteren Systemen musst du expl3 laden).
Die url sollte nicht gerade mit einem Befehl anfangen, und Umlaute usw muss man mit Klammern schützen.

\documentclass{article}
\usepackage{xcolor}

\newsavebox\MyArrowBox%
\sbox\MyArrowBox{$\hookleftarrow$}%

\ExplSyntaxOn

\newcommand{\AddBreakableChars}[1]{%
 \tl_set:No \l_tmpa_tl {#1}
 \tl_replace_all:Nnn \l_tmpa_tl { ~ } { \nobreakspace } 
 \seq_set_split:NnV \l_tmpa_seq {}\l_tmpa_tl
 \seq_use:Nn\l_tmpa_seq {\discretionary{\usebox\MyArrowBox}{}{}}
}

\ExplSyntaxOff
\newcommand*{\MyUrl}{https://tex.stack\textbackslash exchange.com/\textasciigrave questions/28835/opt ion-to- break-urls-with-carriage-return-symbol}%

\begin{document}
\parbox{2cm}{\textcolor{blue}{\AddBreakableChars{abcdefghet idass gr{ü}{ß}e}}}

\parbox{4cm}{\textcolor{blue}{\AddBreakableChars{\MyUrl}}}

\bigskip
\parbox{7cm}{\textcolor{blue}{\AddBreakableChars{\MyUrl}}}
\end{document}

knbg
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: Di 24. Mär 2020, 21:23

Re: Wie kann ich die Loop bzw das Macro (s.u.) so ändern, dass auch \textbackslash etc verwendet werden können?

Beitrag von knbg »

Vielen Dank, das funktioniert!

(Bei meinem MiKTeX musst ich noch expl3 und textcomp laden)


Antworten