.png)
Em resumo: quero desenhar a seguinte figura em Assíntota.
Meu código é o seguinte.
size(5cm);
draw(scale(8, 4)*unitsquare);
label("$\underbrace{123}+\underbrace{456}=\underbrace{789}$", (4, 3));
draw((2.1, 2.5)--(1, 1), Arrow);
draw((3.95, 2.5)--(4, 1), Arrow);
draw((5.9, 2.5)--(7, 1), Arrow);
label("\strut$a$", (1, 1.1), S);
label("\strut$b$", (4, 1.1), S);
label("\strut$c$", (7, 1.1), S); // \strut is used to make the baselines horizontally aligned.
Problema: Nas 3 draw
linhas, a coordenada x do ponto inicial das setas está codificada.
Como posso calcular automaticamente a localização do início da seta a partir da posição da ponta do suporte?
(ser capaz de calcular a largura do rótulo ajudaria, mas também não consigo ver como.)
Algo semelhante ao tikzmark
recurso mostrado emhttps://tex.stackexchange.com/a/145696/250119ajudaria, mas não tenho conhecimento de tal recurso no Asymptote.
Responder1
Solução parcial. Um pouco adaptado dehttps://sourceforge.net/p/asymptote/discussion/409349/thread/3fc73fb8/.
Se você pensar bem, o tamanho do rótulo em relação à coordenada do usuário não é determinado até o final do programa - o que definitivamente causa um problema. Então, esta é apenas uma solução parcial queele assume unitsize
que está consertado.
Basicamente, ele constrói 5 objetos de rótulo, então para cada objeto ele é colocado em um picture
, então seu tamanho é medido min()/max()/size()
para determinar o ponto médio da borda inferior da caixa.
Observe que para que min()
etc. retorne o valor correto, unitsize()
a subimagem deve ser definida corretamente.
Infelizmente,este método interrompe o espaçamento--- Não tenho certeza de como isso pode ser corrigido.
var unitsize=1cm;
unitsize(unitsize);
string template="$\underbrace{1}$";
picture a;
unitsize(a, unitsize);
// draw the labels, and compute the coordinate of the bottom points along the way
label(a, baseline("$\underbrace{123}$", template), (0, 0), align=NE);
pair bottom1=((min(a, user=true).x+max(a, user=true).x)/2, min(a, user=true).y);
label(a, baseline("$+$", template), (max(a, user=true).x, 0), align=NE);
real u=max(a, user=true).x;
label(a, baseline("$\underbrace{456}$", template), (max(a, user=true).x, 0), align=NE);
pair bottom2=((u+max(a, user=true).x)/2, min(a, user=true).y);
label(a, baseline("$=$", template), (max(a, user=true).x, 0), align=NE);
real u=max(a, user=true).x;
label(a, baseline("$\underbrace{789}$", template), (max(a, user=true).x, 0), align=NE);
pair bottom3=((u+max(a, user=true).x)/2, min(a, user=true).y);
// compute shift such that the text is centered at x = 4
pair ashift=(4-size(a, user=true).x/2, 3);
// draw the text on currentpicture
add(shift(ashift)*a);
// some other text for comparison
label("$\underbrace{123}+\underbrace{456}=\underbrace{789}$", (4, 4), align=N);
label("$123+456=789$", (4, 5), align=N);
// draw the arrows
draw(ashift+bottom1--(1, 1), Arrow);
draw(ashift+bottom2--(4, 1), Arrow);
draw(ashift+bottom3--(7, 1), Arrow);
label(baseline("$a$"), (1, 1.1), S);
label(baseline("$b$"), (4, 1.1), S);
label(baseline("$c$"), (7, 1.1), S);