From 0574caf5b1e13f2fc1adb8743c2e835a84531554 Mon Sep 17 00:00:00 2001 From: Franck Dary <franck.dary@lis-lab.fr> Date: Wed, 18 May 2022 15:29:55 +0200 Subject: [PATCH] Improved conllu2latex --- scripts/conllu2latex.py | 117 ++++++++++++++++++++++++---------------- 1 file changed, 70 insertions(+), 47 deletions(-) diff --git a/scripts/conllu2latex.py b/scripts/conllu2latex.py index 7cd872f..5ffc380 100755 --- a/scripts/conllu2latex.py +++ b/scripts/conllu2latex.py @@ -67,35 +67,40 @@ def getLayout(sentence, text) : ranges = [ranges[i] for i in range(len(ranges)) if i not in multis] for i in range(len(ranges)) : - if ranges[i][0] != -1 : - continue - start = 0 - if i > 0 : - start = ranges[i-1][1]+1 - j = i - while ranges[j][0] == -1 : - j += 1 - end = ranges[j][0]-1 - size = end-start +1 - each = size // (j-i) - for k in range(j-i) : - ranges[i+k][0] = start + k*each - ranges[i+k][1] = ranges[i+k][0]+each-1 - i = j - - for i in range(len(ranges)-1) : - if ranges[i][1] != ranges[i+1][0]-1 : - if ranges[i][1]-ranges[i][0] <= ranges[i+1][1]-ranges[i+1][0] : - ranges[i][1] = ranges[i+1][0]-1 - else : - ranges[i+1][0] = ranges[i][1]+1 + end = ranges[i][-1] + if end+1 in range(len(text)) and text[end+1] == " " : + ranges[i][-1] += 1 + +# for i in range(len(ranges)) : +# if ranges[i][0] != -1 : +# continue +# start = 0 +# if i > 0 : +# start = ranges[i-1][1]+1 +# j = i +# while ranges[j][0] == -1 : +# j += 1 +# end = ranges[j][0]-1 +# size = end-start +1 +# each = size // (j-i) +# for k in range(j-i) : +# ranges[i+k][0] = start + k*each +# ranges[i+k][1] = ranges[i+k][0]+each-1 +# i = j +# +# for i in range(len(ranges)-1) : +# if ranges[i][1] != ranges[i+1][0]-1 : +# if ranges[i][1]-ranges[i][0] <= ranges[i+1][1]-ranges[i+1][0] : +# ranges[i][1] = ranges[i+1][0]-1 +# else : +# ranges[i+1][0] = ranges[i][1]+1 return sentence, ranges ################################################################################ ################################################################################ -def produceTabular(sentence, ranges, text, columns, nodes, reduce, breakSize, mask=[None,None], hsep=True) : +def produceTabular(sentence, ranges, text, columns, nodes, reduce, breakSize, mask=[None,None], hsep=True, isCenter=lambda _:False, isColored=lambda _:False, colSizes=None, title=None) : if mask[0] not in [None, "incr", "seq"] : print("ERROR : invalid mask '%s'"%mask, file=sys.stderr) @@ -113,15 +118,23 @@ def produceTabular(sentence, ranges, text, columns, nodes, reduce, breakSize, ma partSizes = [-ranges[parts[partId][0]][0]+ranges[parts[partId][-1]][1]+1 for partId in range(len(parts))] + curLine = -1 + colsep = "|" if hsep else "" for partId in range(len(parts)) : if partId != 0 : print("\\vspace{7pt}\n") - print("\\begin{tabular}{|l|%s|}"%(colsep.join(["c"]*partSizes[partId]))) + colsDef = colsep.join(["c"]*partSizes[partId]) + print("\\begin{tabular}{|@{\hskip 4pt}l@{\hskip 3pt}|@{\hskip 3pt}%s|}"%(colsDef)) + if title is not None : + print("\multicolumn{%d}{c}{\large %s}\\\\"%(partSizes[partId]+1, title)) print("\cline{1-%d}\n"%(partSizes[partId]+1)) for i in range(len(columns))[::-1] : + curLine += 1 + curCol = -1 print("\\texttt{\\textbf{\\footnotesize{%s}}}"%columns[i].lower(), end=" &\n") for j in parts[partId] : + curCol += 1 if columns[i] == "EOS" : value = "yes" if j == parts[partId][-1] and partId == len(parts)-1 else "no" else : @@ -150,10 +163,23 @@ def produceTabular(sentence, ranges, text, columns, nodes, reduce, breakSize, ma values[k] = "\\texttt{%s}"%(values[k]) cellContent = "\\\\".join(values) tcolsep = colsep if j != parts[partId][-1] else "|" + color = "" + if isColored((curLine, curCol)) : + color = r"\cellcolor{green!15}" + if isCenter((curLine, curCol)) : + color = r"\cellcolor{blue!30}" if nodes : - print("\multicolumn{%d}{c%s}{\makecell[cc]{\\tabnode{%s}}}"%(ranges[j][1]-ranges[j][0]+1, tcolsep, cellContent), end=" &\n" if j != parts[partId][-1] else "") + if colSizes is not None : + cellSize = colSizes[curCol] + if cellSize > 0 : + cellSize = "%dpt"%(3+cellSize*5.5) + print("\multicolumn{%d}{c%s}{%s\makecell[cb]{\parbox{%s}{%s}}}"%(ranges[j][1]-ranges[j][0]+1, tcolsep, color, cellSize, cellContent), end=" &\n" if j != parts[partId][-1] else "") + else : + print("\multicolumn{%d}{c%s}{%s\makecell[cb]{%s}}"%(ranges[j][1]-ranges[j][0]+1, tcolsep, color, cellContent), end=" &\n" if j != parts[partId][-1] else "") + else : + print("\multicolumn{%d}{c%s}{%s\makecell[cb]{%s}}"%(ranges[j][1]-ranges[j][0]+1, tcolsep, color, cellContent), end=" &\n" if j != parts[partId][-1] else "") else : - print("\multicolumn{%d}{c%s}{\makecell[cc]{%s}}"%(ranges[j][1]-ranges[j][0]+1, tcolsep, cellContent), end=" &\n" if j != parts[partId][-1] else "") + print("\multicolumn{%d}{c%s}{\makecell[cb{%s}}"%(ranges[j][1]-ranges[j][0]+1, tcolsep, cellContent), end=" &\n" if j != parts[partId][-1] else "") if nodes and i != 0 : print("\\\\%s\n"%("[-0.1cm]" if i == 1 else "[%scm]"%(breakSize))) else : @@ -323,35 +349,32 @@ def drawPaths(sentence, ranges, text, columns, hsep, isSeq) : ################################################################################ def drawFeatures(sentence, ranges, text, columns) : - print(r"""\makeatletter -\@ifundefined{tabnode}{% -\newcommand\tabnode[1]{\addtocounter{nodecount}{1} \tikz \node[minimum height=0.5cm] (\arabic{nodecount}) {#1};}% -\newcounter{nodecount}% -}{} -\makeatother -\setcounter{nodecount}{0}""") - print(r"\tikzstyle{every picture}+=[remember picture,baseline]") - print(r"\tikzstyle{every node}+=[inner sep=0pt,anchor=base]") - nbLines = len(sentence[0]) nbCols = len(sentence) center = (nbLines//2, nbCols//2) + isCenter = lambda lc : lc == center + + + isColored = lambda lc : lc[0] >= center[0] and lc[1] <= center[1] + + colSizes = [max(map(len, elem)) for elem in sentence] print(r"\begin{figure}") - print("\\tabcolsep=0.10mm") + print(r"\centering") + print("\\setlength{\\tabcolsep}{0.00mm}") print(r"\resizebox{\textwidth}{!}{") - produceTabular(sentence, ranges, text, columns, True, True, "0.1", mask=("seq", center), hsep="") - print(r"\quad", end="") - produceTabular(sentence, ranges, text, columns, True, True, "0.1", mask=("seq", center), hsep="") + isColored = lambda lc : lc[0] >= center[0] and lc[1] <= center[1] + produceTabular(sentence, ranges, text, columns, True, True, "0.1", mask=("seq", center), hsep="", isCenter=isCenter, isColored=isColored, colSizes=colSizes, title=r"Passé-Bas (\palo)") print(r"\quad", end="") - produceTabular(sentence, ranges, text, columns, True, True, "0.1", mask=("incr", center), hsep="") - print("") - - drawRectanglePalo(1, nbLines, nbCols) - drawRectangleFulo(nbLines*nbCols+1, nbLines, nbCols) - drawRectanglePahi(2*nbLines*nbCols+1, nbLines, nbCols) - print("}") + isColored = lambda lc : lc[0] >= center[0] and lc[1] <= center[1] or lc[0] > center[0] + produceTabular(sentence, ranges, text, columns, True, True, "0.1", mask=("seq", center), hsep="", isCenter=isCenter, isColored=isColored, colSizes=colSizes, title=r"Futur-Bas (\fulo)") + print("\n}\n") + print(r"\vspace*{0.25cm}") + print(r"\resizebox{0.5\textwidth}{!}{") + isColored = lambda lc : lc[1] < center[1] or lc[1] == center[1] and lc[0] > center[0] + produceTabular(sentence, ranges, text, columns, True, True, "0.1", mask=("incr", center), hsep="", isCenter=isCenter, isColored=isColored, colSizes=colSizes, title="Passé-Haut (\pahi)") + print("\n}") print(r"\caption{Caption.}") print(r"\label{fig:a}") -- GitLab