Another way is to think of this problem computationally by considering cross-sections along the $z$ axis (arbitrarily chosen).
In any cross-section (say at $z = t$), there are 8 (potentially overlapping or degenerate) line segment, one for each corner's tetrahedron, specifically:
\begin{align}
y_1 &= t &+ x \\
y_2 &= -t &+ x \\
y_3 &= 1-t &- x \\
y_4 &= 1+t &- x \\
y_5 &= t &- x \\
y_6 &= 2-t &- x \\
y_7 &= -1+t &+ x \\
y_8 &= 1-t &+ x \\
\end{align}
(Just try $t=0$ and $t=1$ to convince yourself these are right)
With this in hand, we can turn to the computer to draw all of these for us for any $z$. Here's an implementation in R showing 25 cross-sections, proceeding right and down:
xx = seq(0, 1, length.out = 100L)
col = c('#e6194b', '#3cb44b', '#ffe119', '#0082c8',
'#f58231', '#911eb4', '#46f0f0', '#f032e6')
par(mfrow = c(5, 5), mar = c(0, 0, 0, 0), oma = c(0, 0, 0, 0))
t = seq(0, 1, length.out = prod(par('mfrow')))
coef = data.frame(
t_a = c(0, 0, 1, 1, 0, 2, -1, 1),
t_b = c(1, -1, -1, 1, 1, -1, 1, -1),
b = c(1, 1, -1, -1, -1, -1, 1, 1)
)
for (t_i in t) {
plot(NA, xlim = c(0, 1), ylim = c(0, 1), asp = 1,
xaxt = 'n', yaxt = 'n', ylab = '', xlab = '', bty = 'n')
segments(c(0, 0, 1, 1), c(0, 1, 1, 0), c(0, 1, 1, 0), c(1, 1, 0, 0))
del_t = abs(.5 - t_i)
polygon(c(.5, del_t, .5, 1 - del_t), c(del_t, .5, 1 - del_t, .5),
col = '#e6beff', border = NA)
mtext(side = 3L, sprintf('t = %.2f', t_i), line = -2)
for (ii in seq_len(nrow(coef))) {
with(coef[ii, ], {
yy = t_a + t_b * t_i + b * xx
idx = yy >= 0 & yy <= 1
lines(xx[idx], yy[idx], col = col[ii])
})
}
}
With output:

The shaded square in the middle is your hole. Each of the 8 colors tracks the internal face of each tetrahedron.
We can also use saveGIF from the animation library to turn this into a gif:
