xstring-Befehl im Renewcommand

xstring-Befehl im Renewcommand

Ich versuche, \textttden Befehl mit der Bedingung „Ende“ .oder „ Erneuern“ zu erneuern ,. Aber nachdem ich Folgendes gemacht habe:

\usepackage{xstring}

\let\OldTexttt\texttt
\renewcommand{\texttt}[1]{%
    \OldTexttt{\hspace{0.4em}#1}%
    \IfEndWith{#1}{.}{}{\hspace{0.4em}}%    
}

Bearbeiten: kein funktionierendes Beispiel.

\documentclass{article}

\usepackage{xstring}

\let\OldTexttt\texttt
\renewcommand{\texttt}[1]{%
    \OldTexttt{\hspace{0.4em}#1}%
    \IfEndWith{#1}{.}{}{\hspace{0.4em}}%
    \IfEndWith{#1}{,}{}{\hspace{0.4em}}%    
}


\begin{document}

\section{This is \texttt{section.}}
bbbb 
\texttt{test}
\texttt{section.}
\texttt{section,}
\texttt{test}
aaa

\end{document}

Fehler:

! Argument of \@sect has an extra }.
<inserted text> 
                \par 
l.18 \section{This is \texttt{section.}}

? 
! Emergency stop.
<inserted text> 
                \par 
l.18 \section{This is \texttt{section.}}

Kann mir irgendjemand helfen, was los ist?

Antwort1

hier ein Lösungsversuchexpl3

\documentclass[]{article}
\usepackage[T1]{fontenc}
\usepackage{beramono}
\usepackage{letltxmacro}

\LetLtxMacro\OldTexttt\texttt

\usepackage{xparse}
\ExplSyntaxOn
\cs_new:Npn \petr_extract_lasttoken:n #1
  {
   \tl_head:f { \tl_reverse:n { #1 } }
 }
\cs_generate_variant:Nn \tl_if_eq:nnF {xnF}

\DeclareDocumentCommand \texttt { m }
 {
  \hspace*{0.4cm}
  \OldTexttt{ #1 }
  \tl_if_eq:xnF  { \petr_extract_lasttoken:n {#1}  } { . } {\hspace*{0.4cm}}
 }
\ExplSyntaxOff
\begin{document}


foo \texttt{bar} foo

foo \texttt{bar.} foo

\section{This is \texttt{section.}}
bbbb 
\texttt{test}
\texttt{section.}
\texttt{section,}
\texttt{test}
aaa
\end{document}

Antwort2

Die Neudefinition \textttist nicht robust. Dies kann durch die Verwendung \DeclareRobustCommandeines Pakets erreicht werden letltxmacro, das sich um die internen Aspekte von LaTeX kümmert, wie es in der ursprünglichen Version der Fall ist \texttt:

\documentclass{article}

\usepackage{xstring}
\usepackage{letltxmacro}

\LetLtxMacro\OldTexttt\texttt
\DeclareRobustCommand*{\texttt}[1]{%
    \OldTexttt{\hspace{0.4em}#1}%
    \IfEndWith{#1}{.}{}{%
      \IfEndWith{#1}{,}{}{\hspace{0.4em}}%
    }%
}

\begin{document}

\section{This is \texttt{section.}}
bbbb
[\texttt{test}]
[\texttt{section.}]
[\texttt{section,}]
[\texttt{test}]
aaa

\end{document}

Ergebnis

Aktualisieren:Auch die Logik im Makro ist so festgelegt, dass sie gilt, 0.4emwenn der String nicht mit endet. oder ,.

Antwort3

Das ist eine Aufgabe für l3regex! Natürlich sollte man trotzdem sparen, wenn man \textttverwendet \LetLtxMacro. Ich würde allerdings nicht verwenden \hspace*: Der zusätzliche Platz sollte bei einem Zeilenumbruch verschwinden.

\documentclass{article}
\usepackage[T1]{fontenc}

\usepackage{letltxmacro,xparse,l3regex}
\LetLtxMacro\latextexttt\texttt

\ExplSyntaxOn
\DeclareDocumentCommand \texttt { m }
 {
  \petr_spaced_texttt:n { #1 }
 }
\cs_new_protected:Npn \petr_spaced_texttt:n #1
 {
  \hspace{0.4em}
  \latextexttt{ #1 }
  % Check if the string ends with a period or a comma
  % \Z matches the end of the string
  \regex_match:nnF { (\.|\,) \Z } { #1 } { \hspace{0.4em} }
 }
\ExplSyntaxOff
\begin{document}
\tableofcontents

\section{This is |\texttt{section.}|}
bbbb 
|\texttt{test}|
|\texttt{section.}|
|\texttt{section,}|
|\texttt{test}|
aaa
\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen