Я пытаюсь обновить \texttt
команду с условием на окончание .
или ,
. Но после того, как сделаю это:
\usepackage{xstring}
\let\OldTexttt\texttt
\renewcommand{\texttt}[1]{%
\OldTexttt{\hspace{0.4em}#1}%
\IfEndWith{#1}{.}{}{\hspace{0.4em}}%
}
Редактировать: нерабочий пример.
\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}
Ошибка:
! 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.}}
Кто-нибудь может помочь, в чем проблема?
решение1
вот решение, пытающеесяexpl3
\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}
решение2
Переопределение \texttt
не является надежным. Это можно сделать, используя \DeclareRobustCommand
и используя пакет letltxmacro
, который заботится о внутренних компонентах LaTeX исходного надежного \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}
Обновлять:Также логика в макросе исправлена, чтобы получить 0.4em
, если строка не заканчивается на.
или ,
.
решение3
Это работа для l3regex
! Конечно, все равно следует сохранять \texttt
с помощью \LetLtxMacro
. Однако я бы не стал использовать \hspace*
: дополнительный пробел должен исчезнуть при переносе строки.
\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}