按照Xparse 的新 e-type 参数(k-type 参数的替代),自 TeXLive 2016 起,不再支持 的参数类型,因此到目前为止,我仍坚持使用 TeXLive 2015 xparse
。k_
很多的使用旧参数定义的宏k_
,所以想知道是否有一个简单的补丁可以应用,以便我可以使用新的版本xparse
,并且宏仍然可以k_
工作。
我愿意放弃k_
并使用新的e_
,但不喜欢一次性更改所有宏,然后必须调试哪里出错了。如果我有一个xparse
支持两种参数类型的单一(修补)版本,过渡将容易得多。此外,如果我遇到 2015 版以上的 TeXLive 版本的问题,我需要能够恢复到 TeXLive 2015,直到我解决任何问题。
由于涉及大量宏,下面的解决方案过于繁琐。使用补丁可以让我在过渡到使用e_
参数类型时同时使用这两种方法,并且只有在遇到较新版本的问题时才恢复到下面的解决方案。
参考:
平均能量损失
\documentclass{article}
\usepackage{xparse}
\usepackage{xcolor}
\makeatletter
%% https://tex.stackexchange.com/questions/96570/automatically-determine-which-texlive-version-is-being-used
\def\getversion{\expandafter\get@version\pdftexbanner\@nil}
\def\get@version#1201#2)#3\@nil{\def\TeXLiveVersion{201#2}}
\makeatother
\getversion
\ifnum\TeXLiveVersion<2016
\NewDocumentCommand\MyMacro{k_}{%
\IfNoValueTF{#1}{%
\mathbf{A}
}{%
A_{\textcolor{red}{#1}}
}%
}
\else
\NewDocumentCommand\MyMacro{e_}{%
\MyMacroProcess#1%
}
\NewDocumentCommand\MyMacroProcess{m}{%
\IfNoValueTF{#1}{%
\mathbf{A}
}{%
A_{\textcolor{red}{#1}}
}%
}
\fi
\begin{document}
With a subscript: $\MyMacro_{\pi}$
Without any subscript: $\MyMacro$
\end{document}
答案1
在当前xparse
版本(2017/12/16
)中,以下内容将重新添加k
-type 参数:
\documentclass{article}
\usepackage{xparse}
\usepackage{xcolor}
\ExplSyntaxOn
\tl_if_exist:NF \c_novalue_tl
{ \tl_const:Nx \c_novalue_tl { \c__xparse_no_value_tl } }
\cs_if_exist:NF \__xparse_single_char_check:n
{ \cs_set_eq:NN \__xparse_single_char_check:n \__xparse_single_token_check:n }
\cs_if_exist:NF \__xparse_add_type_K:w
{
\cs_set_protected:Npn \__xparse_tmp:w #1
{
\cs_new_protected:Npn \__xparse_normalize_type_k:w ##1
{ \__xparse_normalize_type_K:w ##1 {#1} }
}
\exp_args:No \__xparse_tmp:w { \c_novalue_tl }
\cs_new_protected:Npn \__xparse_normalize_type_K:w #1#2
{
\__xparse_single_char_check:n {#1}
\quark_if_recursion_tail_stop_do:nn {#2} { \__xparse_bad_arg_spec:wn }
\tl_put_right:Nn \l__xparse_arg_spec_tl { K #1 {#2} }
\tl_put_right:Nn \l__xparse_last_delimiters_tl {#1}
\bool_set_false:N \l__xparse_grab_expandably_bool
\__xparse_normalize_arg_spec_loop:n
}
\cs_new_protected:Npx \__xparse_add_type_K:w #1#2
{
\exp_not:N \__xparse_flush_m_args:
\exp_not:N \__xparse_add_default:n {#2}
\cs_if_exist:NTF \__xparse_add_grabber:N
{ \exp_not:N \__xparse_add_grabber:N }
{ \exp_not:N \__xparse_add_grabber_optional:N }
K
\tl_put_right:Nn \exp_not:N \l__xparse_signature_tl { #1 }
\exp_not:N \__xparse_prepare_signature:N
}
\cs_new_protected:Npn \__xparse_grab_K:w #1#2 \__xparse_run_code:
{
\__xparse_grab_K:NnNn #1 {#2}
\cs_set_protected_nopar:Npn
{ _ignore_spaces }
}
\cs_new_protected:Npn \__xparse_grab_K_long:w #1#2 \__xparse_run_code:
{
\__xparse_grab_K:NnNn #1 {#2}
\cs_set_protected:Npn
{ _ignore_spaces }
}
\cs_new_protected:Npn \__xparse_grab_K_trailing:w #1#2 \__xparse_run_code:
{
\__xparse_grab_K:NnNn #1 {#2}
\cs_set_protected_nopar:Npn
{ }
}
\cs_new_protected:Npn \__xparse_grab_K_long_trailing:w #1#2 \__xparse_run_code:
{
\__xparse_grab_K:NnNn #1 {#2}
\cs_set_protected:Npn
{ }
}
\cs_new_protected:Npn \__xparse_grab_K:NnNn #1#2#3#4
{
\tl_set:Nn \l__xparse_signature_tl {#2}
\exp_after:wN #3 \l__xparse_fn_tl ##1
{
\__xparse_add_arg:n {##1}
}
\use:c { peek_meaning_remove #4 :NTF } #1
{ \l__xparse_fn_tl }
{
\__xparse_add_arg:o \c_novalue_tl
}
}
}
\ExplSyntaxOff
%
\NewDocumentCommand\MyMacro{k_}{%
\IfNoValueTF{#1}{%
\mathbf{A}%
}{%
A_{\textcolor{red}{#1}}%
}%
}
\begin{document}
With a subscript: $\MyMacro_{\pi}$
Without any subscript: $\MyMacro$
\end{document}
我已经向团队提出了过渡问题,并将在下一版本中更新答案(如果需要)或安排k
-type 提供一些(有限的)过渡支持。但请注意,整个领域仍然处于不断变化之中!
答案2
对于简单情况,它与单个标记一起使用e
并且k
或多或少是相同的,所以如果您只是\IfNoValue
稍微不那么挑剔之间的差异{-NoValue-}
,那么如果它尚未定义,-NoValue-
您可以使用别名k
,因此您的 MWE 会下降到:e
\documentclass{article}
\usepackage{xparse}
\usepackage{xcolor}
\makeatletter
\ExplSyntaxOn
\ifx\__xparse_normalize_type_k:w\undefined
\def\__xparse_normalize_type_k:w{\__xparse_normalize_type_e:w}
\let\xIfNoValueTF\IfNoValueTF
\def\IfNoValueTF#1{\expandafter\xIfNoValueTF\expandafter{\@car#1.\@nil}}
\fi
\ExplSyntaxOff
\NewDocumentCommand\MyMacro{k_}{%
\IfNoValueTF{#1}{%
\mathbf{A}%
}{%
A_{\textcolor{red}{#1}}%
}%
}
\begin{document}
With a subscript: $\MyMacro_{\pi}$
Without any subscript: $\MyMacro$
\end{document}