algorithm2e - 为什么我的一些文本是斜体,而有些不是

algorithm2e - 为什么我的一些文本是斜体,而有些不是

我正在使用algorithm2e。这些是我的声明:

\usepackage{cvpr}
\usepackage{times}
\usepackage{epsfig}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{amssymb}

% For tables
\usepackage{tabu}
%\usepackage{caption} %\captionsetup[table]{skip=10pt}

\bibliographystyle{unsrtnat}
\usepackage[numbers,sort&compress]{natbib}
\usepackage[linesnumbered,boxed]{algorithm2e}
\usepackage{algpseudocode}

% Include other packages here, before hyperref.

% If you comment hyperref and then uncomment it, you should delete
% egpaper.aux before re-running latex.  (Or just hit 'q' on the first latex
% run, let it finish, and you should be clear).
\usepackage[breaklinks=true,bookmarks=false]{hyperref}

这是我的代码。为什么有些文本是斜体,而有些不是?有什么函数可以使文本变成斜体,而不使文本变成斜体?

 \begin{algorithm}
        \SetKwInOut{Input}{Input}
        \SetKwInOut{Output}{Output}
        \Input{a graph G = (V,E)}
        \Output{a hierarchical tree}  
        \BlankLine
        Initialize edge weights\\
        \ForEach{\normalfont{vertex} V_i \subset V } % why is V_i italic but V not ?
        { 
            j \leftarrow \text{argmin}_k(\text{cost}(V_i, V_k)), \ k \subset \text{neighbors} \ \text{of} \ i  \\
            E_{ij} \leftarrow E_{ij} + 1 \\
        }
        \BlankLine
        \ForEach{\normalfont{edge} E_{ij} \subset E }
        { 
            E_{ij} \leftarrow argmin(E_{ij} \normalfont{.weight}), \ j \subset N ) \\
            E_{ij} \leftarrow E_{ij} + 1 \\
        }
    \end{algorithm}

在此处输入图片描述

答案1

您当前的方法/使用方式存在很多问题algorithm2e. 无特定顺序:

  1. 用作\;行尾,而不是\\。如果您不想打印分号,请将其添加\DontPrintSemicolon到您的序言中。

  2. $...包围你的数学内容$

  3. 定义\argmin为运算符

  4. 为了一致性定义执行某些操作的命令。例如,在伪代码中格式化“变量”,可以定义

    \newcommand{\var}{\texttt}
    

    并用于\var每个变量。

  5. \ForEach(以及 中的其他条件子句)的第一个参数algorithm2e使用 进行设置\itshape。如果您希望它不是alics,则使用或it进行设置。{\upshape ...}\textup{...}

  6. 使用mathptmx而不是过时的 times

在此处输入图片描述

\documentclass{article}

\usepackage{mathptmx,amsmath}
\usepackage[linesnumbered,boxed]{algorithm2e}
\DontPrintSemicolon

\DeclareMathOperator{\argmin}{argmin}% https://tex.stackexchange.com/q/5223/5764

\newcommand{\var}{\texttt}

\begin{document}

 \begin{algorithm}
  \SetKwInOut{Input}{Input}
  \SetKwInOut{Output}{Output}
  \Input{a graph $G = (V,E)$}
  \Output{a hierarchical tree}  
  \BlankLine
  Initialize edge weights\;
  \ForEach{ \textup{vertex} $V_i \subset V$ }
  { 
    $j \leftarrow \argmin_k (\var{cost}(V_i, V_k))$ where $k \subset \text{neighbours of $i$}$\;
    $E_{ij} \leftarrow E_{ij} + 1$\;
  }
  \BlankLine
  \ForEach{ \textup{edge} $E_{ij} \subset E$ }
  { 
    $E_{ij} \leftarrow \argmin (E_{ij} \text{.weight})$ where $j \subset N$\;
    $E_{ij} \leftarrow E_{ij} + 1$\;
  }
\end{algorithm}

\end{document}

顺便说一句,我发现使用

$E_{ij} \leftarrow E_{ij} + 1$\;

多余的,因为伪代码构造已经表明你正在经历每个 E_{ij}。此外,E_{ij} + 1指的是什么?

答案2

我同意上面的回答。我将补充以下内容:所有样式都可以重新定义为算法,但您必须了解如何理解文本。首先,如果这是数学,它将显示为数学,这意味着斜体其次,这取决于这是普通文本还是关键字、函数、算法命令的参数等的文本...

我附上了一个基于您的代码的示例,以展示如何编写您的算法:1)使用数学模式,如上所述,当您编写数学时 2)定义您自己的变量宏,再次如上所述:您可以使用算法风格的 SetKwData 宏和 SetDataSty 来控制变量的样式 3)使用 SetKwFunction 定义算法的函数(argmin 和 cost)4)使用算法提供的宏重新定义算法文本的样式

这是我根据您的示例(特别注意在 ForEach 中输入为参数的顶点与在 ArgSty 中输入为数据(变量)的边之间的差异)

\documentclass[a4paper]{article}

\usepackage[lined,linesnumbered,boxed]{algorithm2e}
\usepackage{amsmath,amssymb,amstext}
\usepackage{xcolor,xcolor-material}

\SetKwFunction{argmin}{argmin$_k$}
\SetKwFunction{cost}{cost}
\SetKw{Of}{of}
\SetKwData{neighbors}{neighbors}
\SetKwData{edge}{edge}

\newcommand{\mykwsty}[1]{\textcolor{blue}{\emph{#1}}}
\newcommand{\myfuncsty}[1]{\textcolor{red}{\textbf{\texttt{#1}}}}
\newcommand{\myvarsty}[1]{\textcolor{GoogleGreen}{\texttt{#1}}}
\SetKwSty{mykwsty}
\SetArgSty{textbf}
\SetFuncSty{myfuncsty}
\SetDataSty{myvarsty}

\begin{document}

\begin{algorithm}
        \SetKwInOut{Input}{Input}
        \SetKwInOut{Output}{Output}
        \Input{a graph G = (V,E)}
        \Output{a hierarchical tree}  
        \BlankLine
        Initialize edge weights\\
        \ForEach{vertex $V_i\subset V$} % why is V_i italic but V not ?
        { 
            $j \leftarrow\argmin{\cost{$V_i, V_k$}},  k\subset\neighbors\ \Of\  i$\;
            $E_{ij}\leftarrow E_{ij} + 1$\;
        }
        \BlankLine
        \ForEach{\edge $E_{ij}\subset E$}
        { 
            $E_{ij}\leftarrow\argmin\left(E_{ij}\text{weight}\right),  j\subset N )$\;
            $E_{ij} \leftarrow E_{ij} + 1$\;
        }
    \end{algorithm}
\end{document}

给出

在此处输入图片描述

相关内容