Ich versuche, \texttt
den 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 \texttt
ist nicht robust. Dies kann durch die Verwendung \DeclareRobustCommand
eines 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}
Aktualisieren:Auch die Logik im Makro ist so festgelegt, dass sie gilt, 0.4em
wenn der String nicht mit endet.
oder ,
.
Antwort3
Das ist eine Aufgabe für l3regex
! Natürlich sollte man trotzdem sparen, wenn man \texttt
verwendet \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}