2016-06-28 3 views
2

Я хочу по-разному покрасить отдельные группы большого числа. НапримерКак покрасить группы большого числа в LaTeX

111222333444.555 

Я хочу быть 111 красными, 222, чтобы быть зелеными, 333, чтобы быть синим, а 444,555 быть черным.

До сих пор я использовал это:

\newcommand{ \byte}[1]{{\textcolor[rgb]{0.0,0.0,0.0}{#1}}} 
\newcommand{\kilobyte}[1]{{\textcolor[rgb]{0.0,0.0,0.5}{#1}}} 
\newcommand{\megabyte}[1]{{\textcolor[rgb]{0.0,0.0,1.0}{#1}}} 
\newcommand{\gigabyte}[1]{{\textcolor[rgb]{0.7,0.0,0.0}{#1}}} 

\newcommand{\BBx}[1]{{\byte{#1}}} 
\newcommand{\KBx}[2]{{\kilobyte{#1},\BBx{#2}}} 
\newcommand{\MBx}[3]{{\megabyte{#1},\KBx{#2}{#3}}} 
\def\BBrelax#1\relax{\BBx{#1}} 
\def\KBrelax#1,#2\relax{\KBx{#1}{#2}} 
\def\MBrelax#1,#2,#3\relax{\MBx{#1}{#2}{#3}} 
\def\BB#1{\BBrelax#1\relax} 
\def\KB#1{\KBrelax#1\relax} 
\def\MB#1{\MBrelax#1\relax} 

и я хотел бы написать

\MB{111,222,333.444} blah blah blah \KB{111,222} 

Но это имеет тот недостаток, что я сам определить, насколько большой номер и использовать правильную команду в зависимости от количества цифр, и мне пришлось отделить их вручную. Однако теперь я загружаю эти данные автоматически (csvreader), поэтому мне нужна команда, чтобы делать все это автоматически.

В основном я ищу реализацию команды, где я могу сказать

\mynumber{111222333444.666, red, green, blue, black} 
\mynumber{111222.333, red, green, blue, black} 

и он делает правильную вещь для меня (последние 3 цифры в том числе десятичных знаков будет черным, тысячи синий, миллионы зеленых, и миллиарды красные). Было бы хорошо иметь верхнюю границу (например, для обработки максимального количества групп), но она должна иметь возможность обрабатывать большие числа, а также небольшие числа.

Что я пробовал: я попытался использовать команду \ num и \ sepnum, обе кажутся неспособными делать то, что я хочу. Я попытался реализовать его сам с помощью fp и некоторых умных вычислений, но для этого мне понадобилось бы модульное и целочисленное деление с плавающей запятой, оба они не поддерживаются этим пакетом.

Любые идеи? Заранее спасибо.

Edit: Я хочу, чтобы использовать его как это:

\documentclass{article} 

\usepackage{csvsimple} % for csv reader 
\RequirePackage{xcolor} 

\begin{document} 

\myno{.555} 
\myno{111222333444.555} 
\myno{111222333444} 
\myno{444555666777888999.12345} 

\begin{figure}[htp!] 
\centering 
\csvreader[tabular=r r, table head=Hello & World\\]{test.csv}{Foo=\foo,Bar=\bar}{\myno{\foo} & \myno{\bar}} 
\caption{Baz} 
\label{figure:baz} 
\end{figure} 

\end{document} 

с файлом CSV (test.csv):

Foo,Bar 
1,2 
222,333 
222333.444,11122233344555 

ответ

2

Пожалуйста, найти образец TeX-файл с макросами для вас:

\documentclass{article} 

\RequirePackage{xcolor} 

\begin{document} 

%111222333444.555 
%I want 
%111 to be red, 
%222 to be green, 
%333 to be blue, and 
%444.555 to be black. 

\makeatletter 
% Two counters, one for each command and another for each digits. 
\newcounter{myno} 
\newcounter{mynod} 

% Its nothing, but just to have \@nil command to parse the string. 
\let\@nil\relax 
% \myno will take the number and add [email protected]@ after the number so that 
% even if you have given a number without decimal it won't fail 
\def\myno#1{% 
\expandafter\myNo#[email protected]@\@nil% 
} 
% Storing the default value if there is no decimal value 
\def\[email protected]@{@@} 
% Defining \myNo which contains either 000.00 or [email protected]@ as argument 
\expandafter\def\expandafter\myNo#1.#2\@nil{\def\[email protected]{#2}% 
% the counter of command is incremented 
\stepcounter{myno}% 
% the counter of digit is reset to 0 
\setcounter{mynod}{0}% 
% iterating through each digits and storing it in a control sequence 
% also note that here #1 will be digits before decimal 
\@tfor\xx:=#1\do{\stepcounter{mynod}% 
    \expandafter\xdef\csname [email protected]\themyno @\themynod\endcsname{\xx}% 
}% 
% setting the total digits defined to a temp counter a and setting another temp counter b to 0 
\@tempcnta=\themynod% 
\@tempcntb=0% 
% make a loop if tempcnta>0 
\loop\ifnum\@tempcnta>0% 
    \advance\@tempcntb by 1% 
    \xdef\myCtr{\the\@tempcnta}% 
    \xdef\myCtrb{\the\@tempcntb}% 
    % setting the right colour at right position 
    \textcolor{% 
    \ifnum\myCtr<4 black\else% 
    \ifnum\myCtr<7 blue\else% 
    \ifnum\myCtr<10 green\else% 
    \ifnum\myCtr<13 red\else% 
    cyan\fi\fi\fi\fi% 
    % putting the digit which was already stored 
    }{\csname [email protected]\themyno @\myCtrb\endcsname}% 
    \advance\@tempcnta by -1% 
\repeat% 
    % if #[email protected]@ then there is no decimal stuff otherwise just strip [email protected]@ which was already added in main macro 
    \ifx\[email protected]\[email protected]@\def\decimal{}\else% 
    \expandafter\myDec#2\@nil% 
    \fi% 
    % print decimal in black colour 
    \textcolor{black}{\decimal}% 
} 
% strip [email protected]@ if it is there 
\def\myDec#1.#2\@nil{\def\decimal{.#1}} 

\makeatother 

\myno{.555} 

\myno{111222333444.555} 

\myno{111222333444} 

\myno{444555666777888999.12345} 

\end{document} 
+0

upvote потому что он работает. Если бы вы могли объяснить мне, как (в комментарии или в редакции), я буду отмечать его также как принято. – loonytune

+0

Другая проблема: хотя она работает в текстовом формате, как я описал, я использую его в csv-ридере. там все числа остаются черными. любые идеи почему? – loonytune

+0

Пожалуйста, отправьте сообщение MWE. – Jagath

Смежные вопросы