补丁 2016 xparse 以支持 k-type 参数

补丁 2016 xparse 以支持 k-type 参数

按照Xparse 的新 e-type 参数(k-type 参数的替代),自 TeXLive 2016 起,不再支持 的参数类型,因此到目前为止,我仍坚持使用 TeXLive 2015 xparsek_很多的使用旧参数定义的宏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}

相关内容