1

We would like to adapt this solution and this one to include the following features:

Amber colored text if under 75% (even better if parameterized) of character limit. Handle empty sections (seems to break if there are no characters in a section)

1 Answer 1

2

You can try this solution based on LuaTeX and scrartcl. For now, major drawbacks are:

  • Cannot count words in macros
  • Does not support headings larger than section
  • Does not support unnumbered headings (\section*, etc)

enter image description here

\documentclass{scrartcl}
\usepackage{expl3}
\usepackage{luacode}
\usepackage{blindtext}
\usepackage{xcolor}

\begin{luacode*}
-- call texcount to count myself!
local handle = io.popen(string.format("texcount -tex -merge -sum %s.tex", tex.jobname))
texcount_lines = {}
while true do
    local line = handle:read("*l")
    if line == nil then
        break
    else
        table.insert(texcount_lines, line)
    end
end
handle:close()


function is_letter(s)
    return s:byte() >= 97 and s:byte() <= 122
end

local cur_section_count = 0
section_words = {}
-- find info line
local info_line_number = nil
for i=1,#texcount_lines do
    local line = string.lower(texcount_lines[i])
    local a, b = line:find("%d++%d++%d")
    if a ~= nil then
        local match = line:sub(a, b)
        local num_table = {}
        match:gsub("%d+", function(s) table.insert(num_table, s) end)
        local colon_pos = line:find(":")
        assert(colon_pos ~= nil)
        local header_start = colon_pos - 1
        while is_letter(line:sub(header_start, header_start)) do
            header_start = header_start - 1
        end
        local header = line:sub(header_start + 1, colon_pos - 1)
        if header == "section" then
            table.insert(section_words, cur_section_count)
            cur_section_count = tonumber(num_table[1])
        else
            cur_section_count = cur_section_count + tonumber(num_table[1])
        end
    end
end
if cur_section_count > 0 then
    table.insert(section_words, cur_section_count)
end
-- remove first 0
table.remove(section_words, 1)

function get_section_words(section_ind)
    local ret = section_words[section_ind]
    if ret == nil then
        tex.print("0")
    end
    tex.print(tostring(ret))
end

\end{luacode*}

\makeatletter
\ExplSyntaxOn
\int_new:N \g_doc_section_counter
\int_gset:Nn \g_doc_section_counter {0}

\tl_new:N \l_doc_tmpa_tl
\int_new:N \l_doc_tmpa_int

\tl_new:N \g_doc_disposition_font_tl
\tl_gset:NV \g_doc_disposition_font_tl \sectfont

\AddtoDoHook{heading/preinit/section}{
    \int_gincr:N \g_doc_section_counter
    \tl_set:Nx \l_doc_tmpa_tl {
        \directlua{
            get_section_words(\int_use:N \g_doc_section_counter)
        }
    }
    \int_set:Nn \l_doc_tmpa_int {\l_doc_tmpa_tl}
    \setkomafont{disposition}{\g_doc_disposition_font_tl}
    % the comparision is done here
    % word limit is set to 250
    \int_compare:nNnTF {\l_doc_tmpa_int} < {250} {
        \color{red}
        \addtokomafont{disposition}{\color{red}}
    }{
        \color{black}
    }
}

\ExplSyntaxOff
\makeatother

\begin{document}

\section{Some section}
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet mi nec
ante. Donec ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
a dignissim nibh lectus placerat pede. Vivamus nunc nunc, molestie ut, ultricies
vel, semper in, velit. Ut porttitor. Praesent in sapien. Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Duis fringilla tristique neque. Sed interdum
libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit
sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper.

\subsection{A subsection}

Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper. semper

\subsubsection{A subsubsection}

Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper. semper

Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper. semper

\subsection{A subsection}

Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper. semper


\section{Another section}
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet mi nec
ante. Donec ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
a dignissim nibh lectus placerat pede. Vivamus nunc nunc, molestie ut, ultricies
vel, semper in, velit. Ut porttitor. Praesent in sapien. Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Duis fringilla tristique neque. Sed interdum
libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit
sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper.

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet mi nec
ante. Donec ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
a dignissim nibh lectus placerat pede. Vivamus nunc nunc, molestie ut, ultricies
vel, semper in, velit. Ut porttitor. Praesent in sapien. Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Duis fringilla tristique neque. Sed interdum
libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit
sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper.

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet mi nec
ante. Donec ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
a dignissim nibh lectus placerat pede. Vivamus nunc nunc, molestie ut, ultricies
vel, semper in, velit. Ut porttitor. Praesent in sapien. Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Duis fringilla tristique neque. Sed interdum
libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit
sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper.

\section{Another section}

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet mi nec
ante. Donec ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
a dignissim nibh lectus placerat pede. Vivamus nunc nunc, molestie ut, ultricies
vel, semper in, velit. Ut porttitor. Praesent in sapien. Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Duis fringilla tristique neque. Sed interdum
libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit
sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper.

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet mi nec
ante. Donec ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
a dignissim nibh lectus placerat pede. Vivamus nunc nunc, molestie ut, ultricies
vel, semper in, velit. Ut porttitor. Praesent in sapien. Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Duis fringilla tristique neque. Sed interdum
libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit
sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper.

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet mi nec
ante. Donec ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
a dignissim nibh lectus placerat pede. Vivamus nunc nunc, molestie ut, ultricies
vel, semper in, velit. Ut porttitor. Praesent in sapien. Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Duis fringilla tristique neque. Sed interdum
libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit
sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper.
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet mi nec
ante. Donec ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
a dignissim nibh lectus placerat pede. Vivamus nunc nunc, molestie ut, ultricies
vel, semper in, velit. Ut porttitor. Praesent in sapien. Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Duis fringilla tristique neque. Sed interdum
libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit
sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper.

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet mi nec
ante. Donec ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
a dignissim nibh lectus placerat pede. Vivamus nunc nunc, molestie ut, ultricies
vel, semper in, velit. Ut porttitor. Praesent in sapien. Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Duis fringilla tristique neque. Sed interdum
libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit
sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper.

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet mi nec
ante. Donec ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
a dignissim nibh lectus placerat pede. Vivamus nunc nunc, molestie ut, ultricies
vel, semper in, velit. Ut porttitor. Praesent in sapien. Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Duis fringilla tristique neque. Sed interdum
libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit
sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper.


\section{Test section}

\section{Test section}

This section does not contain enough words.

\section{Test section}

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet mi nec
ante. Donec ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
a dignissim nibh lectus placerat pede. Vivamus nunc nunc, molestie ut, ultricies
vel, semper in, velit. Ut porttitor. Praesent in sapien. Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Duis fringilla tristique neque. Sed interdum
libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit
sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper.

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet mi nec
ante. Donec ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
a dignissim nibh lectus placerat pede. Vivamus nunc nunc, molestie ut, ultricies
vel, semper in, velit. Ut porttitor. Praesent in sapien. Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Duis fringilla tristique neque. Sed interdum
libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit
sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper.

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet mi nec
ante. Donec ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
a dignissim nibh lectus placerat pede. Vivamus nunc nunc, molestie ut, ultricies
vel, semper in, velit. Ut porttitor. Praesent in sapien. Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Duis fringilla tristique neque. Sed interdum
libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit
sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper.
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet mi nec
ante. Donec ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
a dignissim nibh lectus placerat pede. Vivamus nunc nunc, molestie ut, ultricies
vel, semper in, velit. Ut porttitor. Praesent in sapien. Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Duis fringilla tristique neque. Sed interdum
libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit
sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper.

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet mi nec
ante. Donec ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
a dignissim nibh lectus placerat pede. Vivamus nunc nunc, molestie ut, ultricies
vel, semper in, velit. Ut porttitor. Praesent in sapien. Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Duis fringilla tristique neque. Sed interdum
libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit
sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper.

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet mi nec
ante. Donec ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
a dignissim nibh lectus placerat pede. Vivamus nunc nunc, molestie ut, ultricies
vel, semper in, velit. Ut porttitor. Praesent in sapien. Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Duis fringilla tristique neque. Sed interdum
libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit
sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent
lectus tellus, aliquet aliquam, luctus a, egestas a, turpis. Mauris lacinia lorem
sit amet ipsum. Nunc quis urna dictum turpis accumsan semper.

\end{document}

You must log in to answer this question.

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