在“对齐”算法中对齐括号之间的参数(正确)

在“对齐”算法中对齐括号之间的参数(正确)

很难用语言来表达,这就是它应该有的样子

在此处输入图片描述

很接近了,但我的解决方案非常 hack。如果我在 verbatim 环境中,我会尝试获取类似

current <- positions( i ,  j )
south   <- positions( i , j+1)
east    <- positions(i+1,  j )

理想情况下,与底行的i对齐,等等。我只想要一个数学,因为它们非常漂亮;)这是我制作的荒谬混合物:+i

\documentclass[a4paper]{article}
\usepackage[english]{babel}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{xcolor} % for \textcolor
\usepackage{algorithm}
\usepackage{algorithmicx}
\usepackage{algpseudocode}

% https://www.latex4technics.com/?note=1scm
\newlength{\maxwidth}
\newcommand{\algalign}[2]% #1 = text to left, #2 = text to right
{\makebox[\maxwidth][l]{#1{}}{} #2}

% these make me so sad!
\newcommand{\iZero}{\textcolor{white}{+}\textcolor{black}{i}\textcolor{white}{0}}
\newcommand{\jZero}{\textcolor{white}{+}\textcolor{black}{j}\textcolor{white}{0}}
\newcommand{\iOne}{i\textcolor{black}{+1}}
\newcommand{\jOne}{j\textcolor{black}{+1}}
\newcommand{\iMinOne}{i\textcolor{black}{-1}}
\newcommand{\jMinOne}{j\textcolor{black}{-1}}

\begin{document}

\begin{algorithm}
    \caption{An algorithm}
    \begin{algorithmic}
        \settowidth{\maxwidth}{current}
        \State \algalign{current}{$\gets$ positions$(\iZero, \jZero)$}
        \State \algalign{south}{$\gets$ positions$(\iZero, \jOne)$}
        \State \algalign{east}{$\gets$ positions$(\iOne, \jZero)$}
    \end{algorithmic}
\end{algorithm}

\end{document}

algalign我尝试对括号语句执行类似于的操作,但我认为你不能\makebox在 内执行此操作\makebox。目前,我的荒谬宏非常敏感,甚至都不好笑。你必须这样做\textcolor{black}{+1},否则 TeX 会在 和 之间添加原本理想的间距j+此外1,但愿不会发生这种情况,如果有人真的复制它,他们会得到类似positions(+i0, +j0)

有什么建议可以让这些都整齐有序地排列吗?我觉得可能有办法,但也许这更属于“这很愚蠢,不要这样做”的范畴。我只是觉得如果没有间距,阅读起来会更困难。

答案1

您可以使用以下方式在框中设置类似宽度的内容eqparbox

在此处输入图片描述

\documentclass{article}

\usepackage{algorithm,algpseudocode}
\usepackage{eqparbox}

\begin{document}

\begin{algorithm}
  \caption{An algorithm}
  \begin{algorithmic}[1]
    \State \eqmakebox[cse][l]{current} $\gets$ positions$(\eqmakebox[pos-i]{$  i  $}, \eqmakebox[pos-j]{$  j  $})$
    \State \eqmakebox[cse][l]{south}   $\gets$ positions$(\eqmakebox[pos-i]{$  i  $}, \eqmakebox[pos-j]{$j + 1$})$
    \State \eqmakebox[cse][l]{east}    $\gets$ positions$(\eqmakebox[pos-i]{$i + 1$}, \eqmakebox[pos-j]{$  j  $})$
  \end{algorithmic}
\end{algorithm}

\end{document}

由于eqparbox使用类似\label-\ref的系统来建立正确的宽度,因此您必须第一次编译两次。

\eqmakebox[<tag>][<align>]{<stuff>}将所有<stuff>相同的内容设置<tag>在具有类似宽度的文本模式框中,并进行适当的<align>调整。

答案2

在此处输入图片描述

tabular在环境的帮助下\State

\documentclass[a4paper]{article}
\usepackage{algorithm}
\usepackage{algorithmicx}
\newlength{\maxwidth}
\newcommand{\algalign}[2]% #1 = text to left, #2 = text to right
{\makebox[\maxwidth][l]{#1{}}{} #2}

\begin{document}

\begin{algorithm}
    \caption{An algorithm}
    \begin{algorithmic}
%        \settowidth{\maxwidth}{current}
        \State {\setlength\tabcolsep{3pt}
        \begin{tabular}{lcl @{}c@{,\,}c@{}l}
        current & $\gets$ & positions( & $i$   & $j$   & )\\
        south   & $\gets$ & positions( & $i$   & $j+1$ & )\\
        east    & $\gets$ & positions( & $i+1$ & $j$   & )
        \end{tabular}}
    \end{algorithmic}
\end{algorithm}

\end{document}

相关内容