%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% wordcloud %% %% drawing wordclouds %% %% with METAPOST and Lua %% %% chupin@ceremade.dauphine.fr %% %% Version 0.2 (septembre 2023) %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % This work may be distributed and/or modified under the conditions of % the LaTeX Project Public License, either version 1.3c of this license % or (at your option) any later version. The latest version of this % license is in http://www.latex-project.org/lppl.txt % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \NeedsTeXFormat{LaTeX2e}% \def\PackageName{wordcloud}% \def\fileversion{v0.2}% \def\filedate{2023/07/26}% \ProvidesPackage{wordcloud}[\filedate\space\fileversion]% % % package to load \RequirePackage{luamplib}% \mplibtextextlabel{enable} % to allow LaTeX in list of words inside LaTeX document % % load the lua code \directlua{require("wordcloud.lua")}% \ExplSyntaxOn % variable globale \tl_new:N \g__wc_wordcloud_scale_tl \tl_new:N \g__wc_wordcloud_rotate_tl \tl_new:N \g__wc_wordcloud_margin_tl % definitions des clés/valeurs pour la commande \wordcloud \keys_define:nn{wc/wordcloud}{% scale .tl_gset:N = \g__wc_wordcloud_scale_tl, scale .value_required:n = true, rotate .tl_gset:N = \g__wc_wordcloud_rotate_tl, rotate .value_required:n = true, margin .tl_gset:N = \g__wc_wordcloud_margin_tl, margin .value_required:n = true, usecolor .bool_set:N = \g__wc_wordcloud_usecolor_bool, colors .clist_set:N = \g__wc_wordcloud_colors_clist, % list of LaTeX colors colors .value_required:n = true, % usecolor .default:n = true, } % local variable to stock metapost colors list \tl_new:N \l_colors_list_tl% % function to build a wordcloud from a list of the form : % (word1,weight1);(word2,weight2);etc. \NewDocumentCommand\wordcloud{ o m }{% % mandatory argument : list (word1,weight1);(word2,weight2);etc. % optional arguments : % scale= (default 1) % rotate= (default 0) % margin= (default 0.3pt) % usecolor=true/false (default false) % colors={color1,color2,etc} % pour les clés à valeur par défaut \keys_set:nn { wc/wordcloud } { scale=1 } % \keys_set:nn { wc/wordcloud } { rotate=0 } % \keys_set:nn { wc/wordcloud } { margin=0.3pt } % \keys_set:nn { wc/wordcloud } { colors={} } % \keys_set:nn { wc/wordcloud } { usecolor=false } % \tl_clear:N \l_colors_list_tl% \IfNoValueF {#1} { \keys_set:nn { wc/wordcloud } { #1 } } % parse the list to build a list of rgb colors for metapost code \clist_map_variable:NNn \g__wc_wordcloud_colors_clist \l_onecolor_tl {% \extractcolorspecs{\tl_use:N \l_onecolor_tl}{\wc_onecolor_type}{\wc_onecolor_values} % get the type and values of color (see xcolor doc) \convertcolorspec{\wc_onecolor_type}{\wc_onecolor_values}{rgb}\wc_rgb_values % convert to rgb (see xcolor loc) \tl_gput_right:Nx \l_colors_list_tl {(\wc_rgb_values);} % add value with %parenthesis }% %\show {coucous} \directlua{% %tex.sprint("test") wc_build_wordcloud("\luaescapestring{\unexpanded{#2}}",\tl_use:N \g__wc_wordcloud_rotate_tl,\tl_use:N \g__wc_wordcloud_scale_tl,"\tl_use:N \g__wc_wordcloud_margin_tl",\bool_if:NTF \g__wc_wordcloud_usecolor_bool{"true"}{"false"},"\tl_use:N \l_colors_list_tl") }% } % function to build a wordcloud from a text file : \NewDocumentCommand\wordcloudFile{ o m m}{% % two mandatory arguments : name of the file and number of words for the % wordcloud % optional arguments : % scale= (default 1) % rotate= (default 0) % margin= (default 0.3pt) % usecolor=true/false (default false) % colors={color1,color2,etc} % pour les clés à valeur par défaut \keys_set:nn { wc/wordcloud } { scale=1 } % \keys_set:nn { wc/wordcloud } { rotate=0 } % \keys_set:nn { wc/wordcloud } { margin=0.3pt } % \keys_set:nn { wc/wordcloud } { colors={} } % \keys_set:nn { wc/wordcloud } { usecolor=false } % \tl_clear:N \l_colors_list_tl% \IfNoValueF {#1} { \keys_set:nn { wc/wordcloud } { #1 } } % parse the list to build a list of rgb colors for metapost code \clist_map_variable:NNn \g__wc_wordcloud_colors_clist \l_onecolor_tl {% \extractcolorspecs{\tl_use:N \l_onecolor_tl}{\wc_onecolor_type}{\wc_onecolor_values} % get the type and values of color (see xcolor doc) \convertcolorspec{\wc_onecolor_type}{\wc_onecolor_values}{rgb}\wc_rgb_values % convert to rgb (see xcolor loc) \tl_gput_right:Nx \l_colors_list_tl {(\wc_rgb_values);} % add value with %parenthesis }% %\show {coucous} \directlua{% wc_build_wordcloud_file("#2",#3,\tl_use:N \g__wc_wordcloud_rotate_tl,\tl_use:N \g__wc_wordcloud_scale_tl,"\tl_use:N \g__wc_wordcloud_margin_tl",\bool_if:NTF \g__wc_wordcloud_usecolor_bool{"true"}{"false"},"\tl_use:N \l_colors_list_tl") }% } % function to add words to ignor when a wordcloud is build from a text file \NewDocumentCommand\wordcloudIgnoreWords{m}{% % mandatory argument : list of words separated by commas % word1, word2, word3, etc. \directlua{% tab=wc_string_to_tab("#1") wc_add_ignored_words(tab) }% } \ExplSyntaxOff