Class: RSyntaxTree::TikZGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/rsyntaxtree/tikz_generator.rb

Constant Summary collapse

LATEX_ESCAPE_MAP =
{
  '&' => '\\&',
  '%' => '\\%',
  '$' => '\\$',
  '#' => '\\#',
  '_' => '\\_',
  '{' => '\\{',
  '}' => '\\}',
  '~' => '\\textasciitilde{}',
  '^' => '\\textasciicircum{}'
}.freeze
REGION_DEFAULT_COLOR =

Generate TikZ forest code Default region shade color (bare '%') and the forced color in monochrome (color off) mode; matches the SVG backend's gray.

Returns:

  • (String)

    TikZ/forest code

"gray"
REGION_FILL_OPACITY =

Fill stays faint; the border reuses the same color at a higher opacity so the region is clearly bounded in both color and black-and-white output.

"0.2"
REGION_STROKE_OPACITY =
"0.55"
CSS_COLORS =

SVG/CSS extended color keywords -> hex. Used to resolve region shade color names that xcolor does not define (so the generated LaTeX still compiles).

{
  "aliceblue" => "#f0f8ff", "antiquewhite" => "#faebd7", "aqua" => "#00ffff",
  "aquamarine" => "#7fffd4", "azure" => "#f0ffff", "beige" => "#f5f5dc",
  "bisque" => "#ffe4c4", "black" => "#000000", "blanchedalmond" => "#ffebcd",
  "blue" => "#0000ff", "blueviolet" => "#8a2be2", "brown" => "#a52a2a",
  "burlywood" => "#deb887", "cadetblue" => "#5f9ea0", "chartreuse" => "#7fff00",
  "chocolate" => "#d2691e", "coral" => "#ff7f50", "cornflowerblue" => "#6495ed",
  "cornsilk" => "#fff8dc", "crimson" => "#dc143c", "cyan" => "#00ffff",
  "darkblue" => "#00008b", "darkcyan" => "#008b8b", "darkgoldenrod" => "#b8860b",
  "darkgray" => "#a9a9a9", "darkgreen" => "#006400", "darkgrey" => "#a9a9a9",
  "darkkhaki" => "#bdb76b", "darkmagenta" => "#8b008b", "darkolivegreen" => "#556b2f",
  "darkorange" => "#ff8c00", "darkorchid" => "#9932cc", "darkred" => "#8b0000",
  "darksalmon" => "#e9967a", "darkseagreen" => "#8fbc8f", "darkslateblue" => "#483d8b",
  "darkslategray" => "#2f4f4f", "darkslategrey" => "#2f4f4f", "darkturquoise" => "#00ced1",
  "darkviolet" => "#9400d3", "deeppink" => "#ff1493", "deepskyblue" => "#00bfff",
  "dimgray" => "#696969", "dimgrey" => "#696969", "dodgerblue" => "#1e90ff",
  "firebrick" => "#b22222", "floralwhite" => "#fffaf0", "forestgreen" => "#228b22",
  "fuchsia" => "#ff00ff", "gainsboro" => "#dcdcdc", "ghostwhite" => "#f8f8ff",
  "gold" => "#ffd700", "goldenrod" => "#daa520", "gray" => "#808080",
  "green" => "#008000", "greenyellow" => "#adff2f", "grey" => "#808080",
  "honeydew" => "#f0fff0", "hotpink" => "#ff69b4", "indianred" => "#cd5c5c",
  "indigo" => "#4b0082", "ivory" => "#fffff0", "khaki" => "#f0e68c",
  "lavender" => "#e6e6fa", "lavenderblush" => "#fff0f5", "lawngreen" => "#7cfc00",
  "lemonchiffon" => "#fffacd", "lightblue" => "#add8e6", "lightcoral" => "#f08080",
  "lightcyan" => "#e0ffff", "lightgoldenrodyellow" => "#fafad2", "lightgray" => "#d3d3d3",
  "lightgreen" => "#90ee90", "lightgrey" => "#d3d3d3", "lightpink" => "#ffb6c1",
  "lightsalmon" => "#ffa07a", "lightseagreen" => "#20b2aa", "lightskyblue" => "#87cefa",
  "lightslategray" => "#778899", "lightslategrey" => "#778899", "lightsteelblue" => "#b0c4de",
  "lightyellow" => "#ffffe0", "lime" => "#00ff00", "limegreen" => "#32cd32",
  "linen" => "#faf0e6", "magenta" => "#ff00ff", "maroon" => "#800000",
  "mediumaquamarine" => "#66cdaa", "mediumblue" => "#0000cd", "mediumorchid" => "#ba55d3",
  "mediumpurple" => "#9370db", "mediumseagreen" => "#3cb371", "mediumslateblue" => "#7b68ee",
  "mediumspringgreen" => "#00fa9a", "mediumturquoise" => "#48d1cc", "mediumvioletred" => "#c71585",
  "midnightblue" => "#191970", "mintcream" => "#f5fffa", "mistyrose" => "#ffe4e1",
  "moccasin" => "#ffe4b5", "navajowhite" => "#ffdead", "navy" => "#000080",
  "oldlace" => "#fdf5e6", "olive" => "#808000", "olivedrab" => "#6b8e23",
  "orange" => "#ffa500", "orangered" => "#ff4500", "orchid" => "#da70d6",
  "palegoldenrod" => "#eee8aa", "palegreen" => "#98fb98", "paleturquoise" => "#afeeee",
  "palevioletred" => "#db7093", "papayawhip" => "#ffefd5", "peachpuff" => "#ffdab9",
  "peru" => "#cd853f", "pink" => "#ffc0cb", "plum" => "#dda0dd",
  "powderblue" => "#b0e0e6", "purple" => "#800080", "rebeccapurple" => "#663399",
  "red" => "#ff0000", "rosybrown" => "#bc8f8f", "royalblue" => "#4169e1",
  "saddlebrown" => "#8b4513", "salmon" => "#fa8072", "sandybrown" => "#f4a460",
  "seagreen" => "#2e8b57", "seashell" => "#fff5ee", "sienna" => "#a0522d",
  "silver" => "#c0c0c0", "skyblue" => "#87ceeb", "slateblue" => "#6a5acd",
  "slategray" => "#708090", "slategrey" => "#708090", "snow" => "#fffafa",
  "springgreen" => "#00ff7f", "steelblue" => "#4682b4", "tan" => "#d2b48c",
  "teal" => "#008080", "thistle" => "#d8bfd8", "tomato" => "#ff6347",
  "turquoise" => "#40e0d0", "violet" => "#ee82ee", "wheat" => "#f5deb3",
  "white" => "#ffffff", "whitesmoke" => "#f5f5f5", "yellow" => "#ffff00",
  "yellowgreen" => "#9acd32"
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(element_list, params) ⇒ TikZGenerator

Returns a new instance of TikZGenerator.



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/rsyntaxtree/tikz_generator.rb', line 24

def initialize(element_list, params)
  @element_list = element_list
  @params = params

  # forest draws a tree: a parent joined to each daughter by an edge of
  # its own, the root at the top. A derivation is neither — one rule
  # across all the daughters at once, the root last — so the code this
  # backend would emit is a correct tree of the same structure, which is
  # a different figure rather than this one with something missing. What
  # it drops elsewhere (colour, enclosures, decoration) leaves a figure
  # that still says what the tree is. These two do not.
  if params[:derivation] == true || params[:direction] == "btt"
    what = params[:derivation] == true ? "a derivation" : "a tree drawn bottom to top"
    raise RSTError.new(+"Error: TikZ output cannot draw #{what}",
                       code: :invalid_option,
                       hint: "forest joins each daughter with its own edge and puts the root " \
                             "at the top. Use png, svg or pdf for this figure.",
                       retryable: false)
  end
  # Refused rather than quietly drawn straight: a shear is the whole point
  # of the figure that asks for it, and TikZ's own slant (xslant) leaves
  # the bounding box unaware of the lean, so standalone output crops.
  if params[:shear].to_f != 0
    raise RSTError.new(+"Error: TikZ output cannot draw a sheared figure",
                       code: :invalid_option,
                       hint: "Use png, svg or pdf for this figure, or drop the shear option.",
                       retryable: false)
  end
end

Instance Method Details

#generate(standalone: false, font: nil) ⇒ Object



121
122
123
124
125
126
127
128
129
# File 'lib/rsyntaxtree/tikz_generator.rb', line 121

def generate(standalone: false, font: nil)
  tree_code = generate_tree(1)

  if standalone
    generate_standalone(tree_code, font: font)
  else
    generate_forest_only(tree_code)
  end
end