使用 algorithmicx 包 If Then Else,当行太长时缩进中断

使用 algorithmicx 包 If Then Else,当行太长时缩进中断

忽略代码中的西班牙语。问题在于,由于换行符,我得到的then嵌套子句的缩进不正确。if

\documentclass[11pt, oneside]{article}  
\usepackage{algorithm,algpseudocode}
\usepackage{ifthen}
\usepackage{caption}
\usepackage{amsmath}
\usepackage{graphicx}           
\usepackage{amssymb}
\usepackage{ifthen}

\newcommand{\yLuego}{\land _L}
\begin{document}
\begin{itemize}
\algrenewtext{EndIf}{\textbf{fi}}

 \item $ filtrarPorMatch(r,c1,c2) =$ 
 \begin{algorithmic}
 \If{\o?(r)}
     \State \o
 \Else
     \If{$c1 \in campos(dameUno(r)) \land c2 \in campos(dameUno(r)) \yLuego dameUno(r)[c1] = dameUno(r)[c2]$}
          \State $Ag(dameUno(r), filtrarPorMatch(sinUno(r), c1, c2))$
     \Else
         \State $filtrarPorMatch(sinUno(r), c1, c2)$
     \EndIf
 \EndIf
 \end{algorithmic}   

\end{itemize}
\end{document}

filtrarpormatch() 中的 then 子句看起来有误

有什么解决方法或改进方法吗?我必须补充一点,我是 LaTeX 新手,刚开始了解它的工作原理。

编辑:我是这样解决的,但我不认为这是正确的方法:

\If{$c1 \in campos(dameUno(r)) \land c2 \in campos(dameUno(r)) \yLuego \newline
    \hspace*{2em}dameUno(r)[c1] = dameUno(r)[c2]$}

答案1

好吧,我建议\newline在你的长行中使用“毕竟”这个逻辑断点 -- 意思是“毕竟”\land和“毕竟” \yLuego

这个问题您可以找到新命令的定义,\parState例如:

% see https://tex.stackexchange.com/questions/384017/how-to-wrap-lines-correctly-inside-algorithmic-more-indentation-for-children-l
\makeatletter % <=======================================================
\newcommand{\algmargin}{\the\ALG@thistlm}
\makeatother
\algnewcommand{\parState}[1]{\State%
    \parbox[t]{\dimexpr\linewidth-\algmargin}{\strut\hangindent=\algorithmicindent \hangafter=1 #1\strut}}
% <=====================================================================

将该代码添加到您的序言中,然后您可以使用以下代码

\If{\parState{$c1 \in campos(dameUno(r)) \land %\newline <==========
    c2 \in campos(dameUno(r)) \yLuego %\newline
    dameUno(r)[c1] = dameUno(r)[c2]$}}

编写更长的\If语句。请注意,我在此处注释了包含的内容\newline。请先尝试此变体并编译以查看结果,然后取消注释命令\newline,再次编译并检查更改的结果。选择您更喜欢的变体...

请参阅完整的 TeX 代码

\documentclass[11pt, oneside]{article}

\usepackage{showframe} % <==============================================
\usepackage{algorithm,algpseudocode}
\usepackage{ifthen}
\usepackage{caption}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{amssymb}

\newcommand{\yLuego}{\land _L}
% see https://tex.stackexchange.com/questions/384017/how-to-wrap-lines-correctly-inside-algorithmic-more-indentation-for-children-l
\makeatletter % <=======================================================
\newcommand{\algmargin}{\the\ALG@thistlm}
\makeatother
\algnewcommand{\parState}[1]{\State%
    \parbox[t]{\dimexpr\linewidth-\algmargin}{\strut\hangindent=\algorithmicindent \hangafter=1 #1\strut}}
% <=====================================================================


\begin{document}
\begin{itemize}
\algrenewtext{EndIf}{\textbf{fi}}

\item $ filtrarPorValor (r, c, v) =$ 
\begin{algorithmic}
\If{\o?(r)}
    \State \o
\Else
    \If{\parState{$c1 \in campos(dameUno(r)) \land %\newline <==========
        c2 \in campos(dameUno(r)) \yLuego %\newline
        dameUno(r)[c1] = dameUno(r)[c2]$}}
        \State $Ag(dameUno(r), filtrarPorValor(sinUno(r), c, v))$
    \Else
        \State $filtrarPorValor(sinUno(r), c, v)$
    \EndIf
\EndIf
\end{algorithmic}

\end{itemize}
\end{document}

及其结果:

生成的 pdf

删除s%前面的后\newline,得到改变的结果:

生成的 pdf 两个

请注意,我使用包showframe来可视化打字区域和边距。删除它以进行实际工作,它仅用于测试目的...

相关内容