汉明距离在 LaTeX 中的可视化

汉明距离在 LaTeX 中的可视化

例如我有以下两个字符串:

 1: 00101101
 2: 00100100

我希望每个数字都放在一个盒子里,并且数字为 1 的盒子应该高于数字为 0 的盒子。

例子:

 ---------------------------------
 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 |
 --------|   |---|   |   |---|   |
         -----   ---------   -----


         -----       -----
 --------|   |-------|   |--------
 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
 ---------------------------------     

稍后我想玩弄不包含相同数字的框之间的颜色。

我需要一些关于如何制作盒子的帮助。

编辑 看来我的问题不太清楚。我希望 1 或 0 的“框”不会移动,而 1 的“框”会变大……

答案1

您可以构造一个宏来迭代输入,一次读取一个标记。然后,您将标记与0或进行比较1并决定要做什么。命令\zero\one负责实际排版。

\documentclass{article}

\usepackage{calc}
\usepackage{xcolor}

\newcommand{\zero}{\fbox{\textcolor{red}{0}}}
\newcommand{\onea}{\fbox{\rule{0pt}{1em}\textcolor{blue}{1}}}
\newcommand{\oneb}{\fbox{\rule[\heightof{1}-1em]{0pt}{\heightof{1}}\textcolor{blue}{1}}}

\newcommand{\process}[1]{%
  \begingroup
    \def\next##1{%
      \ifx##1\relax
        \let\next=\relax
      \else
        \if0##1%
          \zero
        \else\if1##1%
          \one
        \else
          unknown
        \fi\fi
      \fi
      \next}%
    \next #1\relax
  \endgroup}
\newcommand{\processa}{\let\one=\onea \process}
\newcommand{\processb}{\let\one=\oneb \process}

\begin{document}

Test: \processa{101010}

Test: \processb{101010}

\end{document}

enter image description here

答案2

这是一个使用的解决方案列表包。这接近你想要的吗?

enter image description here

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\lstdefinestyle{hama}{%
    literate={1}{\raisebox{0.5ex}{\fbox{\textcolor{blue}{1}}}}{1}%
        {0}{\fbox{\textcolor{red}{0}}}{1},%
    basicstyle=\ttfamily,%
}
\lstdefinestyle{hamb}{%
    literate={0}{\raisebox{0.5ex}{\fbox{\textcolor{blue}{0}}}}{1}%
        {1}{\fbox{\textcolor{red}{1}}}{1},%
    basicstyle=\ttfamily,%
}

\newcommand{\HAMA}[1]{%
    \lstinline[style=hama]{#1}%
}
\newcommand{\HAMB}[1]{%
    \lstinline[style=hamb]{#1}%
}

\begin{document}
\HAMA{00101101}

\HAMB{00100100}
\end{document}

此解决方案适用于此问题在 DNA 序列中用不同颜色排版不同的字符,其中还有其他几种可能有用的方法。

答案3

有三个可选参数:<position> <color 0> <color 1>。它们从左边,如果您想定义那么<color 1>您也必须指定前面的两个。

\documentclass{article}    
\usepackage{xcolor}
\makeatletter
\def\0{\fbox{\textcolor{\process@colA}{0}}}
\def\1{\fbox{\process@rule\textcolor{\process@colB}{1}}}
\def\process@iv#1{%
  \begingroup
   \def\next##1{%
      \ifx##1\relax
        \let\next=\relax
      \else
        \ifx0##1\0\else\ifx1##1\1\else?\fi\fi
      \fi
      \next}%
    \next #1\relax
  \endgroup}
\def\process{\@ifnextchar[\process@i{\process@iii[b][red][blue]}}
\def\process@i[#1]{\@ifnextchar[{\process@ii[#1]}{\process@iii[#1][red][blue]}}
\def\process@ii[#1][#2]{\@ifnextchar[{\process@iii[#1][#2]}{\process@iii[#1][#2][blue]}}
\def\process@iii[#1][#2][#3]{%
  \ifx#1b\def\process@rule{\rule{0pt}{3ex}}%
  \else\def\process@rule{\rule[-1ex]{0pt}{2ex}}\fi%
  \def\process@colA{#2}%
  \def\process@colB{#3}%
  \process@iv}
\makeatother   
\parindent=0pt
\begin{document}

Test: \process{101010}\\
Test: \process[t]{101010}\\
Test: \process[b][yellow][cyan!80!blue]{101010}\\
Test: \process[t][magenta][gray]{101010}\\
Test  \process{100200}

\end{document}

enter image description here

相关内容