將對齊製表符傳遞給 \ifx

將對齊製表符傳遞給 \ifx

我有以下宏

\usepackage{xintexpr}

\newcommand\seq[4] %length, delimiter, generating func, last term
{%
  \def\s##1{\def\n{##1} #3}
  \xintListWithSep{#2}
  {%
    \xintApply{\s}{\xintSeq{1}{#1}}
  }%
  #2\ldots
  \ifx\\#4\\ %if 4th arg empty
    %empty
  \else
    #2#4
  \fi
}

該類型使用給定的生成函數來設定一個序列,即

$\seq{3}{,}{\n}{n}$
$\seq{4}{,}{\n}{}$
$\seq{3}{,}{\sqrt{\n}}{}$
$\seq{3}{/}{\frac{1}{\n}}{\frac{1}{n}}$

相當於

$1, 2, 3, ..., n$
$1, 2, 3, 4, ...$
$\sqrt{1}, \sqrt{2}, \sqrt{3}, ...$
$\frac{1}{1}/ \frac{1}{2}/ \frac{1}{3}/ .../ \frac{1}{n}$

儘管它按預期工作,但當它處於支援對齊的環境中並傳遞對齊製表符 ( &) 作為第二個參數且第四個參數為空時,它會失敗,即

\begin{align}
  \seq{3}{&&,}{\n}{n} % this works
  \seq{3}{&&,}{\n}{}  % this causes an error 
\end{align}

在修改程式碼後,我得出的結論是,\ifx僅當評估為%empty且前面有字元時,該錯誤才由該語句引起,如以下範例所示:

\documentclass{article}

\usepackage{amsmath}

\newcommand\testa[2]
{%
  \ifx\\#2\\
    %empty, evaluation causes error
  \else
    #1
  \fi
}

\newcommand\testb[2]
{%
  \ifx\\#2\\
    #1
  \else
    %full, evaluation causes error
  \fi
}

\begin{document}
\begin{align}
  \testa{&}{n}    \\ %ok
  \testb{&}{}     \\ %ok
%
  \testa{&}{}     \\ %ok
  \testb{&}{n}    \\ %ok
%
  foo\testa{&}{n} \\ %ok
  foo\testb{&}{}  \\ %ok
%
  foo\testa{&}{}  \\ % causes error
  foo\testb{&}{n}    % causes error
\end{align}
\end{document}

如何更改條件來處理對齊製表符?

如果問題很具體,請告訴我,我會將其刪除。

編輯:加入\usepackage{amsmath}到範例中

答案1

您需要隱藏&正在跳過的分支

\documentclass{article}
\usepackage{amsmath}

\def\useone#1{#1}
\newcommand\testa[2]
{%
  \ifx\\#2\\%%
    %empty, evaluation causes error
  \else
    \useone{#1}%%
  \fi
}

\newcommand\testb[2]
{%
  \ifx\\#2\\%%
    \useone{#1}%%
  \else
    %full, evaluation causes error
  \fi
}

\begin{document}
\begin{align}
  \testa{&}{n}    \\ %ok
  \testb{&}{}     \\ %ok
%
  \testa{&}{}     \\ %ok
  \testb{&}{n}    \\ %ok
%
  foo\testa{&}{n} \\ %ok
  foo\testb{&}{}  \\ %ok
%
  foo\testa{&}{}  \\ % causes error
  foo\testb{&}{n}    % causes error
\end{align}
\end{document}

相關內容