def __init__(self): """ Initialize ``self``. EXAMPLES:: sage: S = WeakReversePlanePartitions() sage: TestSuite(S).run() """ Tableaux.__init__(self, category=Sets())
def __contains__(self, x): """ Return ``True`` if ``t`` can be interpreted as a :class:`SemistandardSuperTableau`. TESTS:: sage: from sage.combinat.shifted_primed_tableau import PrimedEntry sage: T = sage.combinat.super_tableau.SemistandardSuperTableaux_all() sage: [[1,2],[2]] in T True sage: [[PrimedEntry('1p'),PrimedEntry(2)],[PrimedEntry(2)]] in T True sage: [] in T True sage: Tableau([[1]]) in T True sage: StandardSuperTableau([[1]]) in T Traceback (most recent call last): ... ValueError: the entries in a standard tableau must be in bijection with 1',1,2',2,...,n sage: [[1,2],[1]] in T False sage: [[1,1],[5]] in T True sage: [[1,3,2]] in T False """ if isinstance(x, SemistandardSuperTableau): return True elif Tableaux.__contains__(self, x): x = SemistandardSuperTableau._preprocess(x) for row in x: if any(row[c] > row[c+1] for c in range(len(row)-1)): return False if not all(row[c] < row[c+1] for c in range(len(row)-1) if (row[c].is_primed() or row[c+1].is_primed())): return False for row, next in zip(x, x[1:]): if any(row[c] > next[c] for c in range(len(next))): return False if not all(row[c] < next[c] for c in range(len(next)) if (row[c].is_unprimed() or next[c].is_unprimed())): return False return True else: return False
def __contains__(self, x): """ Return ``True`` if ``t`` can be interpreted as a :class:`StandardSuperTableau`. TESTS:: sage: from sage.combinat.shifted_primed_tableau import PrimedEntry sage: T = sage.combinat.super_tableau.StandardSuperTableaux_all() sage: [[0.5,1],[1.5]] in T True sage: [[PrimedEntry('1p'),PrimedEntry('2p')],[PrimedEntry(1)]] in T True sage: [] in T True sage: Tableau([['1p']]) in T True sage: StandardSuperTableau([['1p']]) in T True sage: [[1,2],[1]] in T False sage: [[1,1],[5]] in T False sage: [[1,3,2]] in T False """ if isinstance(x, StandardSuperTableau): return True elif Tableaux.__contains__(self, x): x = SemistandardSuperTableau._preprocess(x) flattened_list = [i for row in x for i in row] a = PrimedEntry('1p') primed_list = [] for i in range(len(flattened_list)): primed_list.append(a) a = a.increase_half() # return True return sorted(flattened_list) == primed_list and (x or (all(row[i]<row[i+1] for row in x for i in range(len(row)-1)) and all(x[r][c]<x[r+1][c] for r in range(len(x)-1) for c in range(len(x[r+1]))) )) else: return False
def tex_from_array(array, with_lines=True): r""" Return a latex string for a two dimensional array of partition, composition or skew composition shape INPUT: - ``array`` -- a list of list - ``with_lines`` -- a boolean (default: ``True``) Whether to draw a line to separate the entries in the array. Empty rows are allowed; however, such rows should be given as ``[None]`` rather than ``[]``. The array is drawn using either the English or French convention following :meth:`Tableaux.global_options``. .. SEEALSO:: :meth:`tex_from_array_tuple` EXAMPLES:: sage: from sage.combinat.output import tex_from_array sage: print tex_from_array([[1,2,3],[4,5]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{3}c}\cline{1-3} \lr{1}&\lr{2}&\lr{3}\\\cline{1-3} \lr{4}&\lr{5}\\\cline{1-2} \end{array}$} } sage: print tex_from_array([[1,2,3],[4,5]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{3}c}\\ \lr{1}&\lr{2}&\lr{3}\\ \lr{4}&\lr{5}\\ \end{array}$} } sage: print tex_from_array([[1,2,3],[4,5,6,7],[8]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{4}c}\cline{1-3} \lr{1}&\lr{2}&\lr{3}\\\cline{1-4} \lr{4}&\lr{5}&\lr{6}&\lr{7}\\\cline{1-4} \lr{8}\\\cline{1-1} \end{array}$} } sage: print tex_from_array([[1,2,3],[4,5,6,7],[8]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{4}c}\\ \lr{1}&\lr{2}&\lr{3}\\ \lr{4}&\lr{5}&\lr{6}&\lr{7}\\ \lr{8}\\ \end{array}$} } sage: print tex_from_array([[None,None,3],[None,5,6,7],[8]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{4}c}\cline{3-3} &&\lr{3}\\\cline{2-4} &\lr{5}&\lr{6}&\lr{7}\\\cline{1-4} \lr{8}\\\cline{1-1} \end{array}$} } sage: print tex_from_array([[None,None,3],[None,5,6,7],[None,8]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{4}c}\cline{3-3} &&\lr{3}\\\cline{2-4} &\lr{5}&\lr{6}&\lr{7}\\\cline{2-4} &\lr{8}\\\cline{2-2} \end{array}$} } sage: print tex_from_array([[None,None,3],[None,5,6,7],[8]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{4}c}\\ &&\lr{3}\\ &\lr{5}&\lr{6}&\lr{7}\\ \lr{8}\\ \end{array}$} } sage: print tex_from_array([[None,None,3],[None,5,6,7],[None,8]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{4}c}\\ &&\lr{3}\\ &\lr{5}&\lr{6}&\lr{7}\\ &\lr{8}\\ \end{array}$} } sage: Tableaux.global_options(convention="french") sage: print tex_from_array([[1,2,3],[4,5]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{3}c}\cline{1-2} \lr{4}&\lr{5}\\\cline{1-3} \lr{1}&\lr{2}&\lr{3}\\\cline{1-3} \end{array}$} } sage: print tex_from_array([[1,2,3],[4,5]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{3}c}\\ \lr{4}&\lr{5}\\ \lr{1}&\lr{2}&\lr{3}\\ \end{array}$} } sage: print tex_from_array([[1,2,3],[4,5,6,7],[8]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{4}c}\cline{1-1} \lr{8}\\\cline{1-4} \lr{4}&\lr{5}&\lr{6}&\lr{7}\\\cline{1-4} \lr{1}&\lr{2}&\lr{3}\\\cline{1-3} \end{array}$} } sage: print tex_from_array([[1,2,3],[4,5,6,7],[8]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{4}c}\\ \lr{8}\\ \lr{4}&\lr{5}&\lr{6}&\lr{7}\\ \lr{1}&\lr{2}&\lr{3}\\ \end{array}$} } sage: print tex_from_array([[None,None,3],[None,5,6,7],[8]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{4}c}\cline{1-1} \lr{8}\\\cline{1-4} &\lr{5}&\lr{6}&\lr{7}\\\cline{2-4} &&\lr{3}\\\cline{3-3} \end{array}$} } sage: print tex_from_array([[None,None,3],[None,5,6,7],[None,8]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{4}c}\cline{2-2} &\lr{8}\\\cline{2-4} &\lr{5}&\lr{6}&\lr{7}\\\cline{2-4} &&\lr{3}\\\cline{3-3} \end{array}$} } sage: print tex_from_array([[None,None,3],[None,5,6,7],[8]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{4}c}\\ \lr{8}\\ &\lr{5}&\lr{6}&\lr{7}\\ &&\lr{3}\\ \end{array}$} } sage: print tex_from_array([[None,None,3],[None,5,6,7],[None,8]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{4}c}\\ &\lr{8}\\ &\lr{5}&\lr{6}&\lr{7}\\ &&\lr{3}\\ \end{array}$} } sage: Tableaux.global_options.reset() """ lr=lr_macro.substitute(bar='|' if with_lines else '') if Tableaux.global_options("convention")=='english': return '{%s\n%s\n}' % (lr, tex_from_skew_array(array, with_lines)) else: return '{%s\n%s\n}' % (lr, tex_from_skew_array(array[::-1], with_lines, align='t'))
def tex_from_array_tuple(a_tuple, with_lines=True): r""" Return a latex string for a tuple of two dimensional array of partition, composition or skew composition shape. INPUT: - ``a_tuple`` -- a tuple of lists of lists - ``with_lines`` -- a boolean (default: ``True``) Whether to draw lines to separate the entries in the components of ``a_tuple``. .. SEEALSO:: :meth:`tex_from_array` for the description of each array EXAMPLES:: sage: from sage.combinat.output import tex_from_array_tuple sage: print tex_from_array_tuple([[[1,2,3],[4,5]],[],[[None,6,7],[None,8],[9]]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{3}c}\cline{1-3} \lr{1}&\lr{2}&\lr{3}\\\cline{1-3} \lr{4}&\lr{5}\\\cline{1-2} \end{array}$},\emptyset,\raisebox{-.6ex}{$\begin{array}[b]{*{3}c}\cline{2-3} &\lr{6}&\lr{7}\\\cline{2-3} &\lr{8}\\\cline{1-2} \lr{9}\\\cline{1-1} \end{array}$} } sage: print tex_from_array_tuple([[[1,2,3],[4,5]],[],[[None,6,7],[None,8],[9]]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{3}c}\\ \lr{1}&\lr{2}&\lr{3}\\ \lr{4}&\lr{5}\\ \end{array}$},\emptyset,\raisebox{-.6ex}{$\begin{array}[b]{*{3}c}\\ &\lr{6}&\lr{7}\\ &\lr{8}\\ \lr{9}\\ \end{array}$} } sage: Tableaux.global_options(convention="french") sage: print tex_from_array_tuple([[[1,2,3],[4,5]],[],[[None,6,7],[None,8],[9]]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{3}c}\cline{1-2} \lr{4}&\lr{5}\\\cline{1-3} \lr{1}&\lr{2}&\lr{3}\\\cline{1-3} \end{array}$},\emptyset,\raisebox{-.6ex}{$\begin{array}[t]{*{3}c}\cline{1-1} \lr{9}\\\cline{1-2} &\lr{8}\\\cline{2-3} &\lr{6}&\lr{7}\\\cline{2-3} \end{array}$} } sage: print tex_from_array_tuple([[[1,2,3],[4,5]],[],[[None,6,7],[None,8],[9]]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{3}c}\\ \lr{4}&\lr{5}\\ \lr{1}&\lr{2}&\lr{3}\\ \end{array}$},\emptyset,\raisebox{-.6ex}{$\begin{array}[t]{*{3}c}\\ \lr{9}\\ &\lr{8}\\ &\lr{6}&\lr{7}\\ \end{array}$} } """ lr=lr_macro.substitute(bar='|' if with_lines else '') if Tableaux.global_options("convention")=='english': return '{%s\n%s\n}' % (lr, ','.join( r'\emptyset' if comp==[] else tex_from_skew_array(comp, with_lines) for comp in a_tuple)) else: return '{%s\n%s\n}' % (lr, ','.join( r'\emptyset' if comp==[] else tex_from_skew_array(comp[::-1], with_lines, align='t') for comp in a_tuple))
def tex_from_array(array, with_lines=True): r""" Return a latex string for a two dimensional array of partition, composition or skew composition shape INPUT: - ``array`` -- a list of list - ``with_lines`` -- a boolean (default: ``True``) Whether to draw a line to separate the entries in the array. Empty rows are allowed; however, such rows should be given as ``[None]`` rather than ``[]``. The array is drawn using either the English or French convention following :meth:`Tableaux.global_options``. .. SEEALSO:: :meth:`tex_from_array_tuple` EXAMPLES:: sage: from sage.combinat.output import tex_from_array sage: print tex_from_array([[1,2,3],[4,5]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{3}c}\cline{1-3} \lr{1}&\lr{2}&\lr{3}\\\cline{1-3} \lr{4}&\lr{5}\\\cline{1-2} \end{array}$} } sage: print tex_from_array([[1,2,3],[4,5]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{3}c}\\ \lr{1}&\lr{2}&\lr{3}\\ \lr{4}&\lr{5}\\ \end{array}$} } sage: print tex_from_array([[1,2,3],[4,5,6,7],[8]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{4}c}\cline{1-3} \lr{1}&\lr{2}&\lr{3}\\\cline{1-4} \lr{4}&\lr{5}&\lr{6}&\lr{7}\\\cline{1-4} \lr{8}\\\cline{1-1} \end{array}$} } sage: print tex_from_array([[1,2,3],[4,5,6,7],[8]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{4}c}\\ \lr{1}&\lr{2}&\lr{3}\\ \lr{4}&\lr{5}&\lr{6}&\lr{7}\\ \lr{8}\\ \end{array}$} } sage: print tex_from_array([[None,None,3],[None,5,6,7],[8]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{4}c}\cline{3-3} &&\lr{3}\\\cline{2-4} &\lr{5}&\lr{6}&\lr{7}\\\cline{1-4} \lr{8}\\\cline{1-1} \end{array}$} } sage: print tex_from_array([[None,None,3],[None,5,6,7],[None,8]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{4}c}\cline{3-3} &&\lr{3}\\\cline{2-4} &\lr{5}&\lr{6}&\lr{7}\\\cline{2-4} &\lr{8}\\\cline{2-2} \end{array}$} } sage: print tex_from_array([[None,None,3],[None,5,6,7],[8]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{4}c}\\ &&\lr{3}\\ &\lr{5}&\lr{6}&\lr{7}\\ \lr{8}\\ \end{array}$} } sage: print tex_from_array([[None,None,3],[None,5,6,7],[None,8]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{4}c}\\ &&\lr{3}\\ &\lr{5}&\lr{6}&\lr{7}\\ &\lr{8}\\ \end{array}$} } sage: Tableaux.global_options(convention="french") sage: print tex_from_array([[1,2,3],[4,5]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{3}c}\cline{1-2} \lr{4}&\lr{5}\\\cline{1-3} \lr{1}&\lr{2}&\lr{3}\\\cline{1-3} \end{array}$} } sage: print tex_from_array([[1,2,3],[4,5]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{3}c}\\ \lr{4}&\lr{5}\\ \lr{1}&\lr{2}&\lr{3}\\ \end{array}$} } sage: print tex_from_array([[1,2,3],[4,5,6,7],[8]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{4}c}\cline{1-1} \lr{8}\\\cline{1-4} \lr{4}&\lr{5}&\lr{6}&\lr{7}\\\cline{1-4} \lr{1}&\lr{2}&\lr{3}\\\cline{1-3} \end{array}$} } sage: print tex_from_array([[1,2,3],[4,5,6,7],[8]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{4}c}\\ \lr{8}\\ \lr{4}&\lr{5}&\lr{6}&\lr{7}\\ \lr{1}&\lr{2}&\lr{3}\\ \end{array}$} } sage: print tex_from_array([[None,None,3],[None,5,6,7],[8]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{4}c}\cline{1-1} \lr{8}\\\cline{1-4} &\lr{5}&\lr{6}&\lr{7}\\\cline{2-4} &&\lr{3}\\\cline{3-3} \end{array}$} } sage: print tex_from_array([[None,None,3],[None,5,6,7],[None,8]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{4}c}\cline{2-2} &\lr{8}\\\cline{2-4} &\lr{5}&\lr{6}&\lr{7}\\\cline{2-4} &&\lr{3}\\\cline{3-3} \end{array}$} } sage: print tex_from_array([[None,None,3],[None,5,6,7],[8]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{4}c}\\ \lr{8}\\ &\lr{5}&\lr{6}&\lr{7}\\ &&\lr{3}\\ \end{array}$} } sage: print tex_from_array([[None,None,3],[None,5,6,7],[None,8]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{4}c}\\ &\lr{8}\\ &\lr{5}&\lr{6}&\lr{7}\\ &&\lr{3}\\ \end{array}$} } sage: Tableaux.global_options.reset() """ lr=lr_macro.substitute(bar='|' if with_lines else '') if Tableaux.global_options("convention") == "English": return '{%s\n%s\n}' % (lr, tex_from_skew_array(array, with_lines)) else: return '{%s\n%s\n}' % (lr, tex_from_skew_array(array[::-1], with_lines, align='t'))
def tex_from_array_tuple(a_tuple, with_lines=True): r""" Return a latex string for a tuple of two dimensional array of partition, composition or skew composition shape. INPUT: - ``a_tuple`` -- a tuple of lists of lists - ``with_lines`` -- a boolean (default: ``True``) Whether to draw lines to separate the entries in the components of ``a_tuple``. .. SEEALSO:: :meth:`tex_from_array` for the description of each array EXAMPLES:: sage: from sage.combinat.output import tex_from_array_tuple sage: print tex_from_array_tuple([[[1,2,3],[4,5]],[],[[None,6,7],[None,8],[9]]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{3}c}\cline{1-3} \lr{1}&\lr{2}&\lr{3}\\\cline{1-3} \lr{4}&\lr{5}\\\cline{1-2} \end{array}$},\emptyset,\raisebox{-.6ex}{$\begin{array}[b]{*{3}c}\cline{2-3} &\lr{6}&\lr{7}\\\cline{2-3} &\lr{8}\\\cline{1-2} \lr{9}\\\cline{1-1} \end{array}$} } sage: print tex_from_array_tuple([[[1,2,3],[4,5]],[],[[None,6,7],[None,8],[9]]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[b]{*{3}c}\\ \lr{1}&\lr{2}&\lr{3}\\ \lr{4}&\lr{5}\\ \end{array}$},\emptyset,\raisebox{-.6ex}{$\begin{array}[b]{*{3}c}\\ &\lr{6}&\lr{7}\\ &\lr{8}\\ \lr{9}\\ \end{array}$} } sage: Tableaux.global_options(convention="french") sage: print tex_from_array_tuple([[[1,2,3],[4,5]],[],[[None,6,7],[None,8],[9]]]) {\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{3}c}\cline{1-2} \lr{4}&\lr{5}\\\cline{1-3} \lr{1}&\lr{2}&\lr{3}\\\cline{1-3} \end{array}$},\emptyset,\raisebox{-.6ex}{$\begin{array}[t]{*{3}c}\cline{1-1} \lr{9}\\\cline{1-2} &\lr{8}\\\cline{2-3} &\lr{6}&\lr{7}\\\cline{2-3} \end{array}$} } sage: print tex_from_array_tuple([[[1,2,3],[4,5]],[],[[None,6,7],[None,8],[9]]], with_lines=False) {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}} \raisebox{-.6ex}{$\begin{array}[t]{*{3}c}\\ \lr{4}&\lr{5}\\ \lr{1}&\lr{2}&\lr{3}\\ \end{array}$},\emptyset,\raisebox{-.6ex}{$\begin{array}[t]{*{3}c}\\ \lr{9}\\ &\lr{8}\\ &\lr{6}&\lr{7}\\ \end{array}$} } """ lr=lr_macro.substitute(bar='|' if with_lines else '') if Tableaux.global_options("convention") == "English": return '{%s\n%s\n}' % (lr, ','.join( r'\emptyset' if comp==[] else tex_from_skew_array(comp, with_lines) for comp in a_tuple)) else: return '{%s\n%s\n}' % (lr, ','.join( r'\emptyset' if comp==[] else tex_from_skew_array(comp[::-1], with_lines, align='t') for comp in a_tuple))