13

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
5
  • 2
    Paulo Cereda's question contains a TikZ implementation. Look for \drawvotes macro.
    – JLDiaz
    Mar 12, 2013 at 8:15
  • 1
    If you need fuzzy lines (to mimic hand made tally marks), invoke texdoc pstricks and read the page 283-284. Mar 12, 2013 at 15:20
  • 1
    \makeatletter ... \makeatother is missing in the new example
    – user2478
    Mar 12, 2013 at 15:35
  • Your first example is missing the loop. Use my code and replace A by \tallymarksOne B by \tallymarksTwo and so on
    – user2478
    Mar 12, 2013 at 15:36
  • yes, the complete font setting is not needed, and \Tally is also superfluous.
    – user2478
    Mar 12, 2013 at 15:49

5 Answers 5

11

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

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

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

0
6

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

0
3

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

1
1

Simplest way I found was to use \usepackage[misc]{ifsym} and then use commands \StrokeFive, \StrokeFour, \StrokeOne, etc. accordingly enter image description here

3
  • Hi and welcome. Can you give a complete code with an example of usage?
    – AndréC
    Aug 28, 2020 at 8:24
  • 1
    Yes, I'm sorry I should've done it in the first place
    – Avirup Das
    Aug 30, 2020 at 18:58
  • Please don't give the code as a picture, but enter it between the code tags i.e {}, this avoids having to copy it manually and allows copy and paste.
    – AndréC
    Aug 30, 2020 at 19:42

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .