例如我有以下两个字符串:
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}
答案2
这是一个使用的解决方案列表包。这接近你想要的吗?
\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}