One can use NDSolve to construct interpolating functions that parametrize implicit curves. Below I'll show how to get x as a function of y and y as function of x (over appropriate domains, of course).
Unless the denominators of an equation are important, it can help to simplify the equation to eliminate them. In particular, the identity Sinc[u] == u / Sin[u] is extremely helpful in this equation as it removes the discontinuties. (Note in explanation: The curious looking replacement t_Cot :> t, which appears to do nothing, does this: It matches the Tan expressions from eqn, which are automatically converted to Cot expressions. This prevents the second pattern u : x | y from matching the x and y inside the Cot expressions, since they matched the first rule. A cute trick I felt forced to resort to.)
eqn = x/Tan[π x] == y/Tan[π y]; denoms = Sinc[π x] Sinc[π y]; eqn2 = denoms * (eqn /. {t_Cot :> t, u : x | y :> Sin[π u]/Sinc[π u], Equal -> Subtract}) == 0 // Simplify (* Cos[π y] Sinc[π x] == Cos[π x] Sinc[π y] *) ContourPlot[Evaluate@eqn2, {x, -4, 4}, {y, -4, 4}]

We can use the plot to find initial points.
ivReg = RegionNearest[DiscretizeGraphics @ ContourPlot[Evaluate@eqn2, {x, -4., 4.}, {y, -4., 4.}]]
We can find a point on the curve using ivReg to find a starting point for FindRoot. We can then use the point to set up a simple DAE for NDSolve in which y[t] == t and x[t] essentially is equivalent to x as a function y. (In another region, one might want y as a function of x, x as a function of y is better in this part, judging from the contour plot.)
p0 = ivReg[{1, 0}]; y0 = Last[p0]; x0 = x /. FindRoot[eqn2 /. y -> y0, {x, First[p0]}]; xfn = First @ NDSolve[ {eqn2 /. {x -> x[t], y -> y[t]}, y'[t] == 1, x[y0] == x0, y[y0] == y0}, x, {t, -3, 3}]
The interpolating function in xfn has a domain from -3 to 3 but I'll plot just half of it.
ParametricPlot[{x[t], t} /. xfn // Evaluate, {t, 0, 3}]

For those who demand x as a function of y, then here it is:
p0 = ivReg[{1.4, 0.1}]; (* avoid the singularity at y == 0 *) x0 = First[p0]; y0 = y /. FindRoot[eqn2 /. x -> First[p0], {y, Last[p0]}]; yfn = NDSolve[ {eqn2 /. {x -> x[t], y -> y[t]}, x'[t] == 1, x[x0] == x0, y[x0] == y0}, y, {t, 1.4, 3}, "ExtrapolationHandler" -> {Indeterminate &} (* optional *) ]
One gets a NDSolve::ndsz: warning, of course, when the integration hits the x axis. All it means is that the integration has reached the lower limit of the domain. One could Quiet it, I suppose, I prefer to see it, since it confirms my understanding of the problem. Since I let it find the domain automatically, I don't know what it is. I could either extract it from the InterpolatingFunction(see Interpolating Function Anatomy, or, as I've done here, I can make extrapolated values all return Indeterminate. This works nicely with Plot. One can also turn off the extrapolation messages with "ExtrapolationHandler" -> {Indeterminate &, "WarningMessage" -> False}.
ParametricPlot[{t, y[t]} /. yfn // Evaluate, {t, 1.43, 3}]
InterpolatingFunction::dmval: Input value {1.43003} lies outside the range of data in the interpolating function. Extrapolation will be used. >>

Solve[Normal[ Series[x/Tan[Pi x] - y/Tan[Pi y], {x, 1.6, 1}, {y, 0.4, 1}]] == 0, y]. $\endgroup$