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\dospecials
12
\@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}