renewcommand의 xstring 명령

renewcommand의 xstring 명령

\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은 견고하지 않습니다. 이는 원래의 강력한 LaTeX 내부를 관리하는 \DeclareRobustCommand패키지를 사용 하여 수행할 수 있습니다 .letltxmacro\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}

여기에 이미지 설명을 입력하세요

관련 정보