xstring 中的多个条件

xstring 中的多个条件

这可能是一个非常新手的问题,但是在使用 xstring 解析时如何使用多个条件?

我下面链接的可接受答案显示了如何在表中对齐复数。 https://tex.stackexchange.com/a/83639/118726 我希望复数能够采用以下形式a+ib,但同时a-ib需要修改以下行

\StrBefore{#1}{+}[\RealPart]%

查找 + 或 - 之前的字符串。

有任何想法吗?

梅威瑟:

\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage{booktabs}
\usepackage{siunitx}
\usepackage{xstring}
\usepackage{collcell}

\sisetup{
output-complex-root = \ensuremath{\mathrm{i}},
complex-root-position = before-number
}

\newlength{\WidestRealNum}
\settowidth{\WidestRealNum}{$99999$}
\newcommand*{\ApplyNumFormatting}[1]{%
    \StrBefore{#1}{+}[\RealPart]%
    \StrBehind{#1}{i}[\ImagPart]%
    $\makebox[\WidestRealNum][r]{$\RealPart$} + i\,\ImagPart$%
}%

\newcolumntype{N}{>{\collectcell\ApplyNumFormatting}l<{\endcollectcell}}

\begin{document}
\begin{table}
\caption{Some complex numbers }
\label{table:Fhkl}
\centering
\begin{tabular}{ N S[]}
    \toprule
      \multicolumn{1}{c}{N column  } &  \multicolumn{1}{c}{S[] column}\\
        \midrule
     -774.66 - i 325.61    & -774.66 - i 325.61   \\
     774.66 - i 325.61     & 774.66 - i 325.61   \\
     -151.85 + i 325.61    & -151.85 + i 325.61    \\
     151.85 + i 325.61     & 151.85 + i 325.61    \\
        \bottomrule
    \end{tabular}
\end{table}
%


\end{document}

S[] 类型确实是一种解决方案,但我更喜欢符号居中对齐。您可以在下方看到 N 格式,因为它现在对除 a+ib 或 -a+ib 之外的任何内容都失败。

复数 mwe 表

答案1

这不是最优雅的解决方案,但根据上面链接的解决方案,这是我目前所拥有的。我实际上根据@koleygr 提出的想法调整了这个解决方案:

如果这些是“+”,则实部在“+”之前。如果没有“+”,则检查是否有两个“-”。如果有两个“-”,则实部在第二个“-”之前,否则在第一个“-”之前。

\documentclass[a4paper]{article}

\usepackage{booktabs}
\usepackage{siunitx}
\usepackage{xstring}
\usepackage{collcell}

\sisetup{
output-complex-root = \ensuremath{\mathrm{i}},
complex-root-position = before-number
}


\newlength{\WidestRealNum}
\settowidth{\WidestRealNum}{$99999$}
\newcommand*{\ApplyNumFormatting}[1]{%
\IfSubStr{#1}{+}{%
    \StrBefore{#1}{+}[\RealPart]}{%
    \IfSubStr[2]{#1}{-}{%
        \StrBefore[2]{#1}{-}[\RealPart]}{%
        \StrBefore{#1}{-}[\RealPart]}%
   }
 \StrBehind{#1}{i}[\ImagPart]%

\IfSubStr{#1}{+}{%
    $\makebox[\WidestRealNum][r]{$\RealPart$} + i\,\ImagPart$}{%
    $\makebox[\WidestRealNum][r]{$\RealPart$} - i\,\ImagPart$}
}%


\newcolumntype{N}{>{\collectcell\ApplyNumFormatting}l<{\endcollectcell}}

表格如下:

复数表

答案2

另一个使用\IfStrEq命令的解决方案。这个想法是,如果命令未找到“+” \StrBefore,则可选参数\RealPart将保持为空...我在\IfStrEq命令中使用了这种情况。

\documentclass[a4paper]{article}

\usepackage{booktabs}
\usepackage{array}
\usepackage{siunitx}
\usepackage{xstring}
\usepackage{collcell}

\sisetup{
    output-complex-root = \ensuremath{\mathrm{j}},
    complex-root-position = before-number
}

\newlength{\WidestRealNum}
\settowidth{\WidestRealNum}{$99999$}
\newcommand*{\ApplyNumFormatting}[1]{%
\gdef\msign{+}%
    \StrBefore{#1}{\msign}[\RealPart]\IfStrEq{\RealPart}{}{\gdef\msign{-}\StrBefore{#1}{\msign}[\RealPart]}{}%
    \StrBehind{#1}{j}[\ImagPart]%
    $\makebox[\WidestRealNum][r]{$\RealPart$} \msign j\,\ImagPart$%
}%
\newcolumntype{N}{>{\collectcell\ApplyNumFormatting}l<{\endcollectcell}}

\begin{document}
\begin{table}[h!]
    \caption{Bus Loads}
    \label{fig:figurename}
    \centering
        \begin{tabular}{l|N}
        \toprule
        \textbf{Bus} & \multicolumn{1}{c}{\textbf{Bus Load (MVA)}} \\
        \midrule
            b1 &  50 + j 30.99 \\
            b2 & 170 + j105.35\\
            b3 & 200 - j123.94 \\
            b4 & 150 + j49.58 \\
        \bottomrule
        \end{tabular}
\end{table}
\end{document}

就像针对您的问题的另一个快速修复和想法一样(但@ElenasPascal 的答案更完整,并且她得到了我的 +1)

相关内容