为什么我不能将 \@MakeShortVerb 与 minted 一起使用?

为什么我不能将 \@MakeShortVerb 与 minted 一起使用?

shortvrb允许\MakeShortVerb定义单个活动标记,例如,以使其等同于的|方式。为此,定义为扩展为并添加到和。在内部,扩展为,稍后用于设置扩展。|\foo|\verb|\foo||\verb|\dospecials\@sanitize\MakeShortVerb\|\def\@shortvrbdef{\verb}\@MakeShortVerb\|\@shortvrbdef|

我想使用相同的机制,但使用minted。为了使用minted\code(如下面 MWE 中定义)代替\verb,我定义了

\def\MakeShortCode{\def\@shortvrbdef{\code}\@MakeShortVerb}

但是,我得到了错误

! Paragraph ended before \minted@inline@ii was complete.

使用简写时。如果我手动定义

\def|{\code|}

简写很好用。检查两种情况下的定义表明它们确实相同,因此唯一的区别应该是在和中|的注册|\dospecials\@sanitize

为什么会出现此错误?如何在不破坏环境的情况下解决此问题verbatim?这是一个错误minted还是有充分的理由导致此行为?


\documentclass{article}

\usepackage{xparse}
\usepackage{minted}
\usepackage{shortvrb}

\newmintinline[code]{latex}{}

\makeatletter
  \def\MakeShortCode{\def\@shortvrbdef{\code}\@MakeShortVerb}
  \def\MakeShortLstinline{\def\@shortvrbdef{\lstinline}\@MakeShortVerb}
\makeatother

\ExplSyntaxOn
  \NewDocumentCommand\decompose{ m }
    {
      {
        \ttfamily
        \tl_analysis_map_inline:Nn #1 
          {
            \exp_last_unbraced:No \token_to_str:N { ##1 }
            \ensuremath { \sb {##3} }
          }
      }
    }
\ExplSyntaxOff

\begin{document}

\catcode`\|=\active

\def|{\code|}
|\foo|

\decompose|

\MakeShortCode\|
%|\foo| % This will cause an error.

\decompose|

\end{document}

答案1

不确定为什么要让事情变得过于复杂:

\documentclass{article}

\usepackage{minted}

\newmintinline[code]{latex}{}

\catcode`\|=\active
\makeatletter
\protected\def|{%
  \ifmmode
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
  {\string|}{\code|}%
}
\makeatother

\begin{document}

|\foo|

$|a+b|$

\end{document}

在此处输入图片描述

允许本地删除速记的更复杂的版本。

\documentclass{article}

\usepackage{minted}

\newmintinline[code]{latex}{}

\makeatletter
\newcommand{\makemintedshorthand}[1]{%
  \expandafter\chardef\csname catcode#1\endcsname=\catcode`#1
  \begingroup\lccode`~=`#1\lowercase{\endgroup
    \protected\def~{%
      \ifmmode
        \expandafter\@secondoftwo
      \else
        \expandafter\@firstoftwo
      \fi
      {\code~}{#1}%
  }}%
  \catcode`#1=\active
}
\newcommand{\removemintedshorthand}[1]{%
  \ifcsname catcode\string#1\endcsname
    \catcode`#1=\csname catcode\string#1\endcsname
  \fi
}
\makeatother

\makemintedshorthand{|}

\begin{document}

|\foo|

$|a+b|$

\begingroup
\removemintedshorthand{|}
\code$abc|def$ \code|abc$def|

\verb|xyz| \verb"a|b"
\endgroup

|\foo|

\end{document}

在此处输入图片描述

答案2

问题是,在\code|\foo|执行时,TeX 仅在将其类别代码更改|为 后扫描第二个。定义13扩展为0 13(索引表示类别代码),因此实际上扩展为0 13 0 12\dospecials12\@MakeShortVerb|\code||\foo|\code|\foo|,这是行不通的。

我们可以通过修改将13\MakeShortCode定义为0 12来解决这个问题。|\code|

\documentclass{article}

\usepackage{etoolbox}
\usepackage{minted}
\usepackage{shortvrb}

\newmintinline[code]{latex}{}

\makeatletter
  \def\MakeShortCode{\def\@shortvrbdef{\code}\@MakeShortCode}
  \let\@MakeShortCode\@MakeShortVerb
  \patchcmd\@MakeShortCode
    {\expandafter\gdef\expandafter~\expandafter{\@shortvrbdef~}}
    {\xdef~{\expandafter\noexpand\@shortvrbdef\expandafter\@gobble\string#1}}
    {}{}
\makeatother

\MakeShortCode\|

\begin{document}\makeatletter

|\foo{bar} baz|

\begin{minted}{latex}
  I wrote |\foo{bar} baz|.
\end{minted}

\end{document}

相关内容