TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Inspired by Paulo Cereda's question here, I would like to draw tally marks using PSTricks (or TikZ, if no one can help with PSTricks).

I have no idea how to start, so I cannot even present a try myself. :( (This is not good, I know!)

What I would like to have, is a command like \tallymarks;

\tallymarks{1}
\tallymarks{2}
...
\tallymarks{10}

and get an output like the following:

wanted

without the table and the arabic numerals, i.e., only the tally marks themselves.

Update 1

Inspired by Herbert's idea, here is an attempt to use PSTricks.

\documentclass{article}

\usepackage{pstricks-add}

\newcommand*{\tallymarksOne}{
  \pslineByHand(0,0)(0,1)
}
\newcommand*{\tallymarksTwo}{
  \pslineByHand(0,0)(0,1)
  \pslineByHand(0.25,0)(0.25,1)
}
\newcommand*{\tallymarksThree}{
  \pslineByHand(0,0)(0,1)
  \pslineByHand(0.25,0)(0.25,1)
  \pslineByHand(0.5,0)(0.5,1)
}
\newcommand*{\tallymarksFour}{
  \pslineByHand(0,0)(0,1)
  \pslineByHand(0.25,0)(0.25,1)
  \pslineByHand(0.5,0)(0.5,1)
  \pslineByHand(0.75,0)(0.75,1)
}
\newcommand*{\tallymarksFive}{
  \pslineByHand(0,0)(0,1)
  \pslineByHand(0.25,0)(0.25,1)
  \pslineByHand(0.5,0)(0.5,1)
  \pslineByHand(0.75,0)(0.75,1)
  \pslineByHand(-0.75,0)(1,1)
}

\newcounter{TallyTemp}
\def\tallymark#1{%
  \setcounter{TallyTemp}{#1}%
  \ifnum#1>5
    {\Tally E}\addtocounter{TallyTemp}{-5}%
  \else{\Tally%   
    \ifcase#1\or
    \tallymarksOne\addtocounter{TallyTemp}{-1}\or
    \tallymarksTwo\addtocounter{TallyTemp}{-2}\or
    \tallymarksThree\addtocounter{TallyTemp}{-3}\or
    \tallymarksFour\addtocounter{TallyTemp}{-4}\or
    \tallymarksFive\addtocounter{TallyTemp}{-5}%
    \fi}%
  \fi%
  \ifnum\theTallyTemp>0 \expandafter\tallymark\expandafter{\theTallyTemp}\fi
}

\begin{document}

\tallymark{0}
\tallymark{1}
\tallymark{2}
\tallymark{3}
\tallymark{4}
\tallymark{5}
\tallymark{14}

\end{document}

When compiling, I get an error:

! Undefined control sequence.
\tallymark ...ounter {TallyTemp}{-5}\else {\Tally 
                                                  \ifcase #1\or \tallymarksO...
l.50 \tallymark{0}

Update 2

Garbage Coloector's hinted me to the following in the PSTricks manual, but the code won't compile:

\documentclass{article}

\usepackage{pstricks-add}

\def\PstLineFuzzy[#1](#2,#3)(#4,#5)(#6,#7)(#8,#9){%
\pscurve[#1](! #2 rand 101 mod 1000 div sub
#3 rand 101 mod 1000 div sub)
(! #4 rand 101 mod 1000 div sub
#5 rand 101 mod 1000 div sub)
(! #6 rand 101 mod 1000 div sub
#7 rand 101 mod 1000 div sub)
(! #8 rand 101 mod 1000 div sub
#9 rand 101 mod 1000 div sub)}

\def\PstSticks#1{%
\multido{\iStick=0+1,\nXA=0.1+0.1,\nXB=-0.5+0.1,
\nXC=-0.35+0.10,\nXD=-0.15+0.10}{#1}{%
\pst@cnta=\iStick
\pst@cnth=\iStick
\divide\pst@cnth by 5
\multiply\pst@cnth by 5
\ifnum\iStick>0\relax
\ifnum\pst@cnta=\pst@cnth
\PstLineFuzzy[linecolor=red]%
(\nXB,0.2)(\nXC,0.4)(\nXD,0.6)(\nXA,0.8)
\hbox to 0.2\psxunit{}
\fi
\fi
\PstLineFuzzy[](\nXA,0.1)(\nXA,0.4)(\nXA,0.7)(\nXA,1)}}

\begin{document}

\psset{xunit=0.8,yunit=0.3}%
\begin{tabular}{|l|r|p{5.5cm}|}
\hline
Linux
& 27 & \PstSticks{27} \\ \hline
Mac OS X
& 14 & \PstSticks{14} \\ \hline
Windows XP & 43 & \PstSticks{43} \\ \hline
\end{tabular}

\end{document}

The error is

! Undefined control sequence.
<inserted text> \pst 
                     @cnta=\iStick \pst @cnth=\iStick \divide \pst @cnth by ...
l.38 & 27 & \PstSticks{27}
                           \\ \hline
share|improve this question
2  
Paulo Cereda's question contains a TikZ implementation. Look for \drawvotes macro. – JLDiaz Mar 12 '13 at 8:15
1  
If you need fuzzy lines (to mimic hand made tally marks), invoke texdoc pstricks and read the page 283-284. – kiss my armpit Mar 12 '13 at 15:20
1  
\makeatletter ... \makeatother is missing in the new example – Herbert Mar 12 '13 at 15:35
    
Your first example is missing the loop. Use my code and replace A by \tallymarksOne B by \tallymarksTwo and so on – Herbert Mar 12 '13 at 15:36
    
yes, the complete font setting is not needed, and \Tally is also superfluous. – Herbert Mar 12 '13 at 15:49
up vote 11 down vote accepted

with xelatex or lualatex. The font TallyMark is available from http://www.fonts2u.com/tally-mark.font

\documentclass{article}
\usepackage{fontspec}
\newfontface\Tally{TallyMark}
\newcounter{TallyTemp}
\def\tallymark#1{%
  \setcounter{TallyTemp}{#1}%
  \ifnum#1>5
    {\Tally E}\addtocounter{TallyTemp}{-5}%
  \else{\Tally%   
    \ifcase#1\or
    A\addtocounter{TallyTemp}{-1}\or
    B\addtocounter{TallyTemp}{-2}\or
    C\addtocounter{TallyTemp}{-3}\or
    D\addtocounter{TallyTemp}{-4}\or
    E\addtocounter{TallyTemp}{-5}%
    \fi}%
  \fi%
  \ifnum\theTallyTemp>0 \expandafter\tallymark\expandafter{\theTallyTemp}\fi
}

\begin{document}

\tallymark{0}
\tallymark{1}
\tallymark{2}
\tallymark{3}
\tallymark{4}
\tallymark{5}
\tallymark{14}

\end{document}

enter image description here

If you want to use PSTricks then define the commands \ONE, \TWO, ... and draw the lines. Really simple:

\documentclass{article}    
\usepackage{pstricks-add}    
\newcommand*\tallymarksOne{\pslineByHand(0,0)(0,1)}
\newcommand*\tallymarksTwo{\tallymarksOne\pslineByHand(2pt,0)(2pt,1)}
\newcommand*\tallymarksThree{\tallymarksTwo\pslineByHand(4pt,0)(4pt,1)}
\newcommand*\tallymarksFour{\tallymarksThree\pslineByHand(6pt,0)(6pt,1)}
\newcommand*\tallymarksFive{\tallymarksFour\pslineByHand(-17pt,0)(8pt,1)}

\newcounter{TallyTemp}
\def\tallymark#1{%
  \setcounter{TallyTemp}{#1}%
  \ifnum#1>5
    \tallymarksFive\kern14pt \addtocounter{TallyTemp}{-5}%
  \else%   
    \ifcase#1\or
    \tallymarksOne\kern3pt \addtocounter{TallyTemp}{-1}\or
    \tallymarksTwo\kern6pt \addtocounter{TallyTemp}{-2}\or
    \tallymarksThree\kern9pt \addtocounter{TallyTemp}{-3}\or
    \tallymarksFour\kern12pt \addtocounter{TallyTemp}{-4}\or
    \tallymarksFive\kern14pt \addtocounter{TallyTemp}{-5}%
    \fi%
  \fi%
  \ifnum\theTallyTemp>0 \expandafter\tallymark\expandafter{\theTallyTemp}\fi
  \vspace{1cm}
}

\begin{document}

\tallymark{0}\par
\tallymark{1}\par
\tallymark{2}\par
\tallymark{3}\par
\tallymark{4}\par
\tallymark{5}\par
\tallymark{14}

\end{document}

enter image description here

share|improve this answer
    
\psLineByHand from pstricks-add – Herbert Mar 12 '13 at 9:24
1  
then show what you did so far ... – Herbert Mar 12 '13 at 11:39
1  
@SvendMortensen: see edited answer. You can define a height for the lines then it is easier to modify. – Herbert Mar 12 '13 at 16:08
    
the source code of the manual gets lost in the past. – Herbert Mar 12 '13 at 16:14
1  
you should copy my last one which has four vertical lines for the five – Herbert Mar 12 '13 at 16:30

You need not any special font, any PSTricks, only \pdfliteral:

\newcount\tmpnum
\def\tallymarks#1{\leavevmode \lower1bp\vbox to9bp{}%
   \tmpnum=#1
   \loop \ifnum\tmpnum<5 \kern1bp \tallynum\tmpnum \else \tallyV \fi
         \advance\tmpnum by-5
         \ifnum\tmpnum>0 \repeat
}
\def\tallynum#1{\bgroup\tmpnum=#1\relax
   \loop \ifnum\tmpnum>0
         \kern1bp \tallyI \kern1bp
         \advance\tmpnum by-1
         \repeat
   \egroup
}
\def\tallyI{\pdfliteral{q .5 w 0 -1 m 0 8 l S Q}}
\def\tallyV{\kern1bp\pdfliteral{q .5 w -1 0 m 9 7 l S Q}\tallynum4\kern1bp }

test1: \tallymarks{3}

test2: \tallymarks{17}

\bye

tally

share|improve this answer

Here is an expl3 approach:

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn

\int_new:N \snehal_tally_full_int
\int_new:N \snehal_tally_partial_int
\box_new:N \snehal_tally_slash_box

\cs_generate_variant:Nn \int_step_inline:nnnn { nnVn }

\cs_new_protected:Npn \snehal_tally_mark:n #1
 {
  \int_set:Nn \snehal_tally_full_int { \int_div_truncate:nn { #1 } { 5 } }
  \int_set:Nn \snehal_tally_partial_int { \int_mod:nn { #1 } { 5 } }

  \int_step_inline:nnVn { 1 } { 1 } \snehal_tally_full_int
   {
    \hbox_set:Nn \snehal_tally_slash_box { $\big|$ }
    \box_rotate:Nn \snehal_tally_slash_box { -70 }
    \ensuremath
     {
      \ooalign
       {
        $||||$ \tex_cr:D
        \hidewidth \tex_raise:D .7ex \box_use:N \snehal_tally_slash_box \hidewidth
       }
     }~
   }
  \ensuremath
   {
    \int_step_inline:nnVn { 1 } { 1 } \snehal_tally_partial_int { | }
   }
 }

\NewDocumentCommand \tallymark { m }
 {
  \snehal_tally_mark:n { #1 }
 }

\ExplSyntaxOff
\begin{document}

\tallymark{1001}

\end{document}

enter image description here

share|improve this answer

You mentioned that a TikZ solution might be acceptable (if Herbert's excellent answer wasn't present). Also, I prefer the "box method" (I din't know if it has a proper name) for such counting tasks, so I did this here. I don't know if the lines ought to be jittery, it could be added, but so far I did not. The command does not break across lines.

Code

\documentclass[12pt]{article}
\usepackage{tikz}
\usepackage{xifthen}

\begin{document}

\newcommand{\tally}[1]
{   \begin{tikzpicture}[scale=0.5]
        \pgfmathtruncatemacro{\Rest}{#1}
        \xdef\GlobalRest{\Rest}
        \coordinate (temp);
        \whiledo {\GlobalRest > 9}
        {   \fill (temp) ++ (0.2,0) circle (0.04) ++ (0.5,0) circle (0.04) ++ (0,0.5) circle (0.04) ++ (-0.5,0) circle (0.04);
            \draw[line cap=round] (temp) ++ (0.2,0) rectangle ++ (0.5,0.5) -- ++ (-0.5,-0.5) ++ (0.5,0) coordinate (temp) -- ++ (-0.5,0.5);
            \pgfmathtruncatemacro{\Rest}{\GlobalRest-10}
            %\node[below] at (temp) {\Rest};

            \xdef\GlobalRest{\Rest}
        }
        \ifthenelse{\GlobalRest > 0}
        { \fill (temp) ++ (0.2,0) circle (0.04);}{}
        \ifthenelse{\GlobalRest > 1}
        { \fill (temp) ++ (0.7,0) circle (0.04);}{}
        \ifthenelse{\GlobalRest > 2}
        { \fill (temp) ++ (0.7,0.5) circle (0.04);}{}
        \ifthenelse{\GlobalRest > 3}
        { \fill (temp) ++ (0.2,0.5) circle (0.04);}{}

        \ifthenelse{\GlobalRest > 4}
        { \draw (temp) ++ (0.2,0) -- ++ (0.5,0);}{}
        \ifthenelse{\GlobalRest > 5}
        { \draw (temp) ++ (0.7,0) -- ++ (0,0.5);}{}
        \ifthenelse{\GlobalRest > 6}
        { \draw (temp) ++ (0.7,0.5) -- ++ (-0.5,0);}{}
        \ifthenelse{\GlobalRest > 7}
        { \draw (temp) ++ (0.2,0.5) -- ++ (0,-0.5);}{}

        \ifthenelse{\GlobalRest > 8}
        { \draw (temp) ++ (0.2,0) -- ++ (0.5,0.5);}{}
    \end{tikzpicture}
}

\foreach \T in {11,...,20,37,49,54,62,89,243}
{    Lorem ipsum: \tally{\T}

}

\end{document}

Output

enter image description here

share|improve this answer
1  
If you are interested in another tally, here it is Japanese Tally symbol – Yasashii Eirian Nov 27 '15 at 4:48

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.