很难用语言来表达,这就是它应该有的样子
很接近了,但我的解决方案非常 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}