这可能是一个非常新手的问题,但是在使用 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 之外的任何内容都失败。
答案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)