Passando caractere de tabulação de alinhamento para \ifx

Passando caractere de tabulação de alinhamento para \ifx

Eu tenho a seguinte macro

\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
}

esse tipo define uma sequência com a função geradora fornecida, ou seja

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

é equivalente a

$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}$

Embora funcione como esperado, ele falha quando está em um ambiente que suporta alinhamento e recebe um caractere de tabulação de alinhamento ( &) como segundo argumento e o quarto argumento está vazio, ou seja

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

Depois de mexer no código cheguei à conclusão de que o erro é causado pela \ifxinstrução apenas ao avaliar %emptye ser precedida por caracteres, conforme demonstrado pelo exemplo a seguir:

\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}

Como a condicional pode ser alterada para lidar com o caractere de tabulação de alinhamento?

Se a pergunta for muito específica, me avise e eu a removerei.

EDIT: adicionado \usepackage{amsmath}ao exemplo

Responder1

Você precisa ocultar &o branch que está sendo ignorado

\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}

informação relacionada